ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzM2U1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZTMzYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gTWFyIDA5IDIwOjM2OjQ1IEdNVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzAzNTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjEucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMTksIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWE3N2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdmODliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBBbm5vdGF0aW9ucyBDb3JlCi1wbHVnaW5OYW1lPSBBbm5vdGF0aW9ucyBDb3JlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyM2ZlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25DYXRlZ29yeSIgbmFtZT0iQW5ub3RhdGlvbiBDYXRlZ29yeSIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkNhdGVnb3J5LmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25EZWZpbml0aW9uIiBuYW1lPSJBbm5vdGF0aW9uIERlZmluaXRpb24iIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25Jbml0aWFsaXplciIgbmFtZT0iQW5ub3RhdGlvbiBJbml0aWFsaXplciIgc2NoZW1hPSJzY2hlbWEvYW5ub3RhdGlvbkluaXRpYWxpemVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFubm90YXRpb25Qcm9jZXNzb3IiIG5hbWU9IkFubm90YXRpb24gUHJvY2Vzc29yIiBzY2hlbWE9InNjaGVtYS9hbm5vdGF0aW9uUHJvY2Vzc29yLmV4c2QiLz4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5Ij4KLSAgICAgIDxmYWN0b3JpZXMgZW5hYmxlRGVmYXVsdD0idHJ1ZSI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDwvZmFjdG9yaWVzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkNhdGVnb3J5LmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4NTRiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uQ2F0ZWdvcnkuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25DYXRlZ29yeSIgbmFtZT0iQW5ub3RhdGlvbiBDYXRlZ29yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIGNvbnRyaWJ1dGUgYW4gYW5ub3RhdGlvbiBjYXRlZ29yeS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNhdGVnb3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNhdGVnb3J5Ij4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBBbiBhbm5vdGF0aW9uIGNhdGVnb3J5IGNvbnRyaWJ1dGlvbiBkZWZpbmVzIGNhdGVnb3JpZXMgb2YgYW5ub3RhdGlvbnMgdXNlZCB0byBncm91cCB0aGVtIGluIHRoZSBVSS4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFubm90YXRpb24gY2F0ZWdvcnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1cmUgYW5ub3RhdGlvbiBjYXRlb2dvcnkgbmFtZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5JnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhdGVnb3J5Ci0gICAgICAgICAgICBpZD0mcXVvdDtqYXh3cy5jYXRlZ29yeSZxdW90OwotICAgICAgICAgICAgbmFtZT0mcXVvdDtKQVgtV1MmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2NhdGVnb3J5Jmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiAmbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25EZWZpbml0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTI2NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkRlZmluaXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25EZWZpbml0aW9uIiBuYW1lPSJBbm5vdGF0aW9uIERlZmluaXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGNsaWVudHMgdG8gY29udHJpYnV0ZSBhbm5vdGF0aW9ucyAmbHQ7PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24mZ3Q7IHdoaWNoIGFyZSBpbiB0dXJuIGNvbnN1bWVkIGJ5IHRoZSBVSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImFubm90YXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRhcmdldEZpbHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjciLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBjbGFzcyBuYW1lIHRoYXQgZXh0ZW5kcyAmbHQ7Y29kZSZndDtqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uJmx0Oy9jb2RlJmd0OwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjYXRlZ29yeSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgaWQgb2YgYSAmbHQ7dHQmZ3Q7YW5ub3RhdGlvbkNhdGVnb3J5Jmx0Oy90dCZndDsKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeS9jYXRlZ29yeS9AaWQiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXN0cmljdGVkVG8iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFVzZWQgaW4gYWRkaXRpb24gdG8gdGhlIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlKHMpIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgdmFsdWUgZWxlbWVudCBvZiB0aGUgIEBUYXJnZXQgYW5ub3RhdGlvbiBvbiB0aGUgY29udHJpYnV0ZWQgYW5ub3RhdGlvbiB0byBhZGQgZnVydGhlciByZXN0cmljdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJDTEFTU19PTkxZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IklOVEVSRkFDRV9PTkxZIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkVOVU1fT05MWSI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgPC9yZXN0cmljdGlvbj4KLSAgICAgICAgICAgIDwvc2ltcGxlVHlwZT4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0idGFyZ2V0RmlsdGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgYW5ub3RhdGlvbnMgY29yZSBhdXRvbWF0aWNhbGx5IGtub3dzIHdoZXJlIHRvIHBlcm1pdCBhbm5vdGF0aW9ucyBhcyBpdCBpbnNwZWN0cyB0aGUgY29udHJpYnV0ZWQgYW5ub3RhdGlvbiBhbmQKLSAgICAgICAgICAgICAgICAgIHJlYWRzIHRoZSBAVGFyZ2V0IHRoYXQgaGFzIGJlZW4gZGVmaW5lZCBmb3IgaXQuIFRoZXNlIGZpbHRlcnMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZXJlIG1pZ2h0IGJlIGFuIGV4dHJhIHJlc3RyaWN0aW9uCi0gICAgICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhZGQsIGZvciBleGFtcGxlLCBpZiB2ZXJzaW9uIDIgb2YgYW4gYW5ub3RhdGlvbiBhbGxvd3MgYWRkaW5nIHRoZSBhbm5vdGF0aW9uIHRvIGEgZmllbGQsIGFuZCB0aGVuIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgIDMgZGVwcmVjYXRlcyB0aGF0IHVzYWdlLCB5b3UgY2FuIGFkZCBhIGZpbHRlciBoZXJlIHRvIGRpc2FsbG93IHRoZSB1c2FnZSBpbiB0aGUgVUkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICAgICA8c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJUWVBFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Ik1FVEhPRCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJQQVJBTUVURVIiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQ09OU1RSVUNUT1IiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iTE9DQUxfVkFSSUFCTEUiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iQU5OT1RBVElPTl9UWVBFIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9IlBBQ0tBR0UiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbiBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9JnF1b3Q7amF4d3MuY2F0ZWdvcnkmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBuYW1lPSZxdW90O1dlYlNlcnZpY2UmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2Fubm90YXRpb24mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkluaXRpYWxpemVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllMWRiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uSW5pdGlhbGl6ZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIgaWQ9ImFubm90YXRpb25Jbml0aWFsaXplciIgbmFtZT0iQW5ub3RhdGlvbiBJbml0aWFsaXplciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBhc3NvY2lhdGUgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciB3aXRoIGFuIGFubm90YXRpb24gZGVmaW5pdGlvbi4KLQotVGhlIGFubm90YXRpb24gaW5pdGlhbGl6ZXJzIHJvbGUgaXMgdG8gY29uc3RydWN0IHZhbHVlcyBmb3IgdGhlIGFubm90YXRpb25zIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImluaXRpYWxpemVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImluaXRpYWxpemVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgY2xhc3MgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIHRoYXQgdGhpcyBpbml0aWFsaXplcnMgaGFuZGxlcy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImlkZW50aWZpZXIiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uL2Fubm90YXRpb24vQGNsYXNzIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29udHJpYnV0ZWQgaW5pdGlhbGl6ZXIuIFRoZQotY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBhbmQgZXh0ZW5kCi0mbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBpbml0aWFsaXplciBjb250cmlidXRpb246Ci0KLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luaXRpYWxpemVyCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2luaXRpYWxpemVyJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiAmbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc2NoZW1hL2Fubm90YXRpb25Qcm9jZXNzb3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlZjY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uUHJvY2Vzc29yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUiIGlkPSJhbm5vdGF0aW9uUHJvY2Vzc29yIiBuYW1lPSJBbm5vdGF0aW9uIFByb2Nlc3NvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgY2xpZW50cyB0byBjb250cmlidXRlIGFubm90YXRpb24gcHJvY2Vzb29ycy4gVGhlc2UgcHJvY2Vzc29ycyBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyaWJ1dGVkIGFubm90YXRpb24gZGVmaW5pdGlvbnMuCi0KLVRoZSBnb2FsIG9mIHRoZSBwcm9jZXNzb3IgaXMgdG8gdmFsaWRhdGUgYW5ub3RhdGlvbiBydWxlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2Nlc3NvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXNjcmlwdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImFubm90YXRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzIG5hbWUgb2YgdGhlIGFubm90YXRpb24gZGVmaW5pdGlvbiB0aGF0IHRoaXMgcHJvY2Vzc29yIGhhbmRsZXMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJpZGVudGlmaWVyIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbi9hbm5vdGF0aW9uL0BjbGFzcyIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGNvbnRyaWJ1dGVkIHByb2Nlc29yLiBUaGUKLWNsYXNzIG11c3QgYmUgYSBwdWJsaWMgc3ViY2xhc3Mgb2YKLSZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3ImbHQ7L2NvZGUmZ3Q7YW5kIG11c3QgaGF2ZSBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgQW4gb3B0aW9uYWwgYXR0cmlidXRlIHRvIGhvbGQgYSBzaG9ydCB0ZXh0IGRlc2NyaWJpbmcgd2hhdCAmcXVvdDtydWxlJnF1b3Q7IHRoZSBwcm9jZXNzb3IgaGFuZGxlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZWxlbWVudD4KLQotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gYW5ub3RhdGlvbiBwcm9jZXNzb3IgY29udHJpYnV0aW9uOgotCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3ImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSZxdW90O2phdmF4Lmp3cy5XZWJTZXJ2aWNlJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJNZXRob2RSdWxlJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfU0VJX05PX1dFQk1FVEhPU19SVUxFCi0gICAgICAgICAmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICAgICAgJmx0Oy9wcm9jZXNzb3ImZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuICZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjgxOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotCi0vKioKLSAqIEFuIDxjb2RlPkFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBjb250cmlidXRlZCB0aHJvdWdoIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+LAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5PC9jb2RlPiBhbmQKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy4KLSAqIGZvciBhIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzLgotICogPHA+Ci0gKiBJdCBzdXBwbGllcyB0aGUgYW5ub3RhdGlvbiBjbGFzcyBuYW1lLCBpdHMgYW5ub3RhdGlvbiBjYXRlZ29yeSwgdGhlIGFwcGxpY2FibGUgdGFyZ2V0cyBmb3IgdGhlIGFubm90YXRpb24KLSAqIGFuZCBhbiA8Y29kZT5JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyPC9jb2RlPiB0byBpbml0aWFsaXplIHRoZSBhbm5vdGF0aW9ucyBlbGVtZW50LXZhbHVlIHBhaXJzLgotICogPC9wPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1JFU1RSSUNURURfVE8gPSAicmVzdHJpY3RlZFRvIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fQ0xBU1NfT05MWSA9ICJDTEFTU19PTkxZIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVFJJQ1RFRF9UT19JTlRFUkZBQ0VfT05MWSA9ICJJTlRFUkZBQ0VfT05MWSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1RSSUNURURfVE9fRU5VTV9PTkxZID0gIkVOVU1fT05MWSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9UQVJHRVRfRklMVEVSID0gInRhcmdldEZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKLSAgICBwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lOwotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzczsKLSAgICBwcml2YXRlIExpc3Q8RWxlbWVudFR5cGU+IHRhcmdldHM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICBwcml2YXRlIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkluaXRpYWxpemVyOwotICAgIHByaXZhdGUgU3RyaW5nIHJlc3RpY3RlZFRvOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbnRlcmZhY2VPbmx5OwotICAgIHByaXZhdGUgYm9vbGVhbiBjbGFzc09ubHk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGVudW1Pbmx5OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiA8Y29kZT5Bbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gdXNpbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IGFuZCBjYXRlZ29yeSBuYW1lLgotICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uRWxlbWVudCB0aGUgPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gZWxlbWVudCBmcm9tIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Ci0gICAgICogQHBhcmFtIGNhdGVnb3J5IHRoZSBjYXRlZ29yeSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEFubm90YXRpb25EZWZpbml0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLSAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCi0gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNsYXNzTmFtZSA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBdHRyaWJ1dGVWYWx1ZShjb25maWd1cmF0aW9uRWxlbWVudCwgQVRUX0NMQVNTKTsKLSAgICAgICAgdGhpcy5uYW1lID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfTkFNRSk7Ci0gICAgICAgIHRoaXMucmVzdGljdGVkVG8gPSBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QXR0cmlidXRlVmFsdWUoY29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgQVRUX1JFU1RSSUNURURfVE8pOwotICAgICAgICB0aGlzLmNsYXNzT25seSA9IHJlc3RpY3RlZFRvLmVxdWFscyhSRVNUUklDVEVEX1RPX0NMQVNTX09OTFkpOwotICAgICAgICB0aGlzLmludGVyZmFjZU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19JTlRFUkZBQ0VfT05MWSk7Ci0gICAgICAgIHRoaXMuZW51bU9ubHkgPSByZXN0aWN0ZWRUby5lcXVhbHMoUkVTVFJJQ1RFRF9UT19FTlVNX09OTFkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb24gbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgYW5ub3RhdGlvbiBiZWxvbmdzIHRvLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gY2F0ZWdvcnkuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeSgpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzc05hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlc3RyaWN0ZWQgdG8gY2xhc3MgdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGNsYXNzZXMgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzT25seTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFubm90YXRpb24gaXMgcmVzdHJpY3RlZCB0byBpbnRlcmZhY2UgdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGludGVyZmFjZXMgb25seS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZU9ubHkoKSB7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VPbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGVudW0gdHlwZXMuCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYW5ub3RhdGlvbiBpcyByZXN0cmljdGVkIHRvIGVudW1zIG9ubHkuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbnVtT25seSgpIHsKLSAgICAgICAgcmV0dXJuIGVudW1Pbmx5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb24gY2xhc3MgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5jbGFzczwvY29kZT4gYXR0cmlidXRlIG9mIHRoZQotICAgICAqIDxjb2RlPmFubm90YXRpb248YW5ub3RhdGlvbj4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb248L2NvZGU+Ci0gICAgICogZXh0ZW5zaW9uIHBvaW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBjbGFzcwotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbkNsYXNzKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShhbm5vdGF0aW9uQ2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYUNsYXNzLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzcyA9IChDbGFzczxqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPilDbGFzcy5mb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25DbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhjbmZlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBFbGVtZW50VHlwZX0gdGhhdCBzcGVjaWZ5IHRoZSBKYXZhIGVsZW1lbnRzIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uCi0gICAgICogY2FuIGJlIGFwcGxpZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGVsZW1lbnQgdHlwZXMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSBhbm5vdGF0aW9ucwotICAgICAqIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXR9IG1ldGEtYW5ub3RhdGlvbiB0eXBlLiBUaGlzIGxpc3QgY2FuIGJlIGZpbHRlcmVkIHVzaW5nCi0gICAgICogdGhlIDxjb2RlPnRhcmdldEZpbHRlcjwvY29kZT4gZWxlbWVudCBvbiB0aGUKLSAgICAgKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50IHdoZW4gZGVmaW5pbmcKLSAgICAgKiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZWxlbWVudCB0eXBlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxFbGVtZW50VHlwZT4gZ2V0VGFyZ2V0cygpIHsKLSAgICAgICAgaWYgKHRhcmdldHMgPT0gbnVsbCkgewotICAgICAgICAJdGFyZ2V0cyA9IG5ldyBMaW5rZWRMaXN0PEVsZW1lbnRUeXBlPigpOwotCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb25DbGFzcygpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgCVRhcmdldCB0YXJnZXQgPSBhbm5vdGF0aW9uLmdldEFubm90YXRpb24oVGFyZ2V0LmNsYXNzKTsKLSAgICAgICAgICAgIAlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIAkgICAgdGFyZ2V0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0YXJnZXQudmFsdWUoKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8RWxlbWVudFR5cGU+IGZpbHRlcmVkVGFyZ2V0cyA9IGdldEZpbHRlcmVkVGFyZ2V0cyhjb25maWd1cmF0aW9uRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzLmNvbnRhaW5zQWxsKGZpbHRlcmVkVGFyZ2V0cykgJiYgZmlsdGVyZWRUYXJnZXRzLnNpemUoKSA8IHRhcmdldHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLnJlbW92ZUFsbChmaWx0ZXJlZFRhcmdldHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFubm90YXRpb25zIGF0dHJpYnV0ZSBpbml0aWFsaXplciBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkluaXRpYWxpemVyPC9jb2RlPiBleHRlbnNpb24gcG9pbnQgb3IgbnVsbCBpZiBubwotICAgICAqIGluaXRpYWxpemVyIGNhbiBiZSBmb3VuZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkluaXRpYWxpemVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50ID0KLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkuZ2V0KGdldEFubm90YXRpb25DbGFzc05hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyID0gKElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIpY29uZmlndXJhdGlvbkVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXI7Ci0gICAgfQotCi0JICBwcml2YXRlIExpc3Q8RWxlbWVudFR5cGU+IGdldEZpbHRlcmVkVGFyZ2V0cyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQpIHsKLQkJICBMaXN0PEVsZW1lbnRUeXBlPiB0YXJnZXRzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50VHlwZT4oNyk7Ci0JCSAgdHJ5IHsKLQkJCSAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVwcmVjYXRlZFRhcmdldHMgPSBjb25maWd1cmF0aW9uRWxlbWVudC5nZXRDaGlsZHJlbihFTEVNX1RBUkdFVF9GSUxURVIpOwotCQkJICBmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBkZXByZWNhdGVkVGFyZ2V0RWxlbWVudCA6IGRlcHJlY2F0ZWRUYXJnZXRzKSB7Ci0JCQkJICBTdHJpbmcgdGFyZ2V0ID0gQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEF0dHJpYnV0ZVZhbHVlKGRlcHJlY2F0ZWRUYXJnZXRFbGVtZW50LCBBVFRfVEFSR0VUKTsKLQkJCQkgIHRhcmdldHMuYWRkKEVsZW1lbnRUeXBlLnZhbHVlT2YodGFyZ2V0KSk7Ci0JCQkgIH0KLQkJICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2coaWFlKTsKLQkJICB9Ci0JCSAgcmV0dXJuIHRhcmdldHM7Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzgyMDg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zIGFuZCBtZW1iZXIgdmFsdWUgcGFpcnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbnNDb3JlIHsKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNDb3JlKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlycyBhIGxpc3Qgb2Yge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdG8gYWRkIHRvIHRoZSBub3JtYWwgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIGEgbm9ybWFsIGFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIHZhbHVlIHBhaXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTm9ybWFsQW5ub3RhdGlvbiBjcmVhdGVOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsKLQotICAgICAgICBOYW1lIGFubm90YXRpb25UeXBlTmFtZSA9IGFzdC5uZXdOYW1lKGFubm90YXRpb25OYW1lKTsKLQotICAgICAgICBhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFubm90YXRpb25UeXBlTmFtZSk7Ci0KLSAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBhbm5vdGF0aW9uVmFsdWVzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVmFsdWVzLmFkZChtZW1iZXJWYWx1ZVBhaXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNpbmdsZU1lbWJlckFubm90YXRpb259LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHtAbGluayBFeHByZXNzaW9ufSB0byBzZXQgYXMgdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBjcmVhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIE5hbWUgYW5ub3RhdGlvblR5cGVOYW1lID0gYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpOwotCi0gICAgICAgIGFubm90YXRpb24uc2V0VHlwZU5hbWUoYW5ub3RhdGlvblR5cGVOYW1lKTsKLQotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdmFsdWUgPSAoRXhwcmVzc2lvbilFeHByZXNzaW9uLmNvcHlTdWJ0cmVlKGFzdCwgdmFsdWUpOwotICAgICAgICAgICAgYW5ub3RhdGlvbi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNYXJrZXJBbm5vdGF0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIGFubm90YXRpb24uCi0gICAgICogQHJldHVybiBhIG1hcmtlciBhbm5vdGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFya2VyQW5ub3RhdGlvbiBjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotICAgICAgICBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCi0gICAgICAgIE5hbWUgYW5ub3RhdGlvblR5cGVOYW1lID0gYXN0Lm5ld05hbWUoYW5ub3RhdGlvbk5hbWUpOwotCi0gICAgICAgIGFubm90YXRpb24uc2V0VHlwZU5hbWUoYW5ub3RhdGlvblR5cGVOYW1lKTsKLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gIm5hbWUiLgotICAgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSB7QGxpbmsgRXhwcmVzc2lvbn0gInZhbHVlIiBvZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gYXN0Lm5ld01lbWJlclZhbHVlUGFpcigpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuYW1lKSk7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpci5zZXRWYWx1ZShleHByZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYSB7QGxpbmsgU3RyaW5nTGl0ZXJhbH0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+ICJ2YWx1ZSIuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3RyaW5nTWVtYmVyVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHN0cmluZ01lbWJlclZhbHVlUGFpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYSB7QGxpbmsgQm9vbGVhbkxpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4gInZhbHVlIi4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIEJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGJvb2xlYW5WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgQW5ub3RhdGlvbnNDb3JlCi0gICAgICAgICAgICAgICAgLmNyZWF0ZUJvb2xlYW5MaXRlcmFsKGFzdCwgdmFsdWUuYm9vbGVhblZhbHVlKCkpKTsKLQotICAgICAgICByZXR1cm4gYm9vbGVhblZhbHVlUGFpcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYSB7QGxpbmsgTnVtYmVyTGl0ZXJhbH0gdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZW1iZXIgdmFsdWUgcGFpciAibmFtZSIuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+ICJ2YWx1ZSIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBjcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcHJpbWl0aXZlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU51bWJlckxpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgIHJldHVybiBwcmltaXRpdmVWYWx1ZVBhaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGEge0BsaW5rIE5hbWV9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBlbmNsb3NpbmcgY2xhc3MgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5lbnVtPC9jb2RlPiB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCBjcmVhdGVFbnVtTGl0ZXJhbChhc3QsIGNsYXNzTmFtZSwgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggYSB7QGxpbmsgVHlwZUxpdGVyYWx9IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgIm5hbWUiLgotICAgICAqIEBwYXJhbSB2YWx1ZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwKLSAgICAgICAgICAgICAgICBjcmVhdGVUeXBlTGl0ZXJhbChhc3QsIHZhbHVlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIGFuIHtAbGluayBBcnJheUluaXRpYWxpemVyfSB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgbWVtYmVyIHZhbHVlIHBhaXIuCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyICJuYW1lIi4KLSAgICAgKiBAcGFyYW0gdmFsdWVzIGFuIGFycmF5IG9mIDxjb2RlPk9iamVjdDwvY29kZT4gdmFsdWVzLiBTdXBwb3J0cyAge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LCB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LCB7QGxpbmsgamF2YS5sYW5nLkNsYXNzfSB2YWx1ZXMuCi0gICAgICogQHJldHVybiBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBhcnJheSBvZiB2YWx1ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU1lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIGNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKGFzdCwgdmFsdWVzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQXJyYXlJbml0aWFsaXplcn0uCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgQXJyYXlJbml0aWFsaXplcn0uCi0gICAgICogQHBhcmFtIHZhbHVlcyBhbiBhcnJheSBvZiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlcy4gU3VwcG9ydHMgIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwge0BsaW5rIGphdmEubGFuZy5Cb29sZWFufSwge0BsaW5rIGphdmEubGFuZy5DbGFzc30gdmFsdWVzLgotICAgICAqIEByZXR1cm4gYSBuZXcgc3JyYXkgaW5pdGlhbGl6ZXIuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBBcnJheUluaXRpYWxpemVyIGNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKEFTVCBhc3QsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICBBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgc3RyaW5nVmFsdWUuc3Vic3RyaW5nKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWUubGFzdEluZGV4T2YoIi4iKSkpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5hZGQoY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsIHN0cmluZ1ZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKGNyZWF0ZUJvb2xlYW5MaXRlcmFsKGFzdCwgKEJvb2xlYW4pIHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBRdWFsaWZpZWROYW1lfSB0byByZXByZXNlbnQgYW4gPGNvZGU+ZW51bTwvY29kZT4gbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcy4KLSAgICAgKiBAcGFyYW0gdmFsdWUgc24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgPGNvZGU+ZW51bTwvY29kZT4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFF1YWxpZmllZE5hbWUgY3JlYXRlRW51bUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIGNsYXNzTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgZW51bU5hbWUgPSBudWxsOwotICAgICAgICBTaW1wbGVOYW1lIGVudW1DbGFzc05hbWUgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIFNpbXBsZU5hbWUgZW51bUxpdGVyYWwgPSBhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGVuY2xvc2luZ0NsYXNzTmFtZSA9IHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZW5jbG9zaW5nQ2xhc3NOYW1lLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgZW51bUVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudW1FbmNsb3NpbmdDbGFzc05hbWUgPSBhc3QubmV3TmFtZShlbmNsb3NpbmdDbGFzc05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUXVhbGlmaWVkTmFtZSBxdWFsaWZpZWROYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUoZW51bUVuY2xvc2luZ0NsYXNzTmFtZSwgZW51bUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBlbnVtTmFtZSA9IGFzdC5uZXdRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIGVudW1MaXRlcmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE5hbWUgcXVhbGlmaWVkTmFtZSA9IGFzdC5uZXdOYW1lKHZhbHVlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgIGVudW1OYW1lID0gYXN0Lm5ld1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgZW51bUxpdGVyYWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbnVtTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUeXBlTGl0ZXJhbH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHtAbGluayBUeXBlTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIHZhbHVlIGEgPGNvZGU+Q2xhc3M8L2NvZGU+IG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgdHlwZSBsaXRlcmFsLgotICAgICAqIEByZXR1cm4gYSBuZXcgdHlwZSBsaXRlcmFsIG9yIG51bGwgaXQgdGhlIHZhbHVlIGlzIG5vdCBvZiB0eXBlIDxjb2RlPkNsYXNzPC9jb2RlPiBvciA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVHlwZUxpdGVyYWwgY3JlYXRlVHlwZUxpdGVyYWwoQVNUIGFzdCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gbnVsbDsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsID0gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCAoQ2xhc3M8Pz4pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgIHR5cGVMaXRlcmFsID0gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHR5cGVMaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFR5cGVMaXRlcmFsfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdHlwZSBsaXRlcmFsLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY2xhc3MgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyB0eXBlIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUeXBlTGl0ZXJhbCBjcmVhdGVUeXBlTGl0ZXJhbChBU1QgYXN0LCBDbGFzczw/PiB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCi0gICAgICAgIENsYXNzPD8+IGFDbGFzcyA9IHZhbHVlOwotICAgICAgICBTaW1wbGVOYW1lIGNsYXNzTmFtZSA9IGFzdC5uZXdTaW1wbGVOYW1lKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCi0gICAgICAgIGlmIChhQ2xhc3MuaXNNZW1iZXJDbGFzcygpKSB7Ci0gICAgICAgICAgICBOYW1lIGVuY2xvc2luZ0NsYXNzTmFtZSA9IGFzdC5uZXdOYW1lKGFDbGFzcy5nZXRFbmNsb3NpbmdDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICBRdWFsaWZpZWRUeXBlIHF1YWxpZmllZFR5cGUgPSBhc3QubmV3UXVhbGlmaWVkVHlwZShhc3QubmV3U2ltcGxlVHlwZShlbmNsb3NpbmdDbGFzc05hbWUpLCBjbGFzc05hbWUpOwotICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShxdWFsaWZpZWRUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0eXBlTGl0ZXJhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCB2YWx1ZS5nZXRDYW5vbmljYWxOYW1lKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFR5cGVMaXRlcmFsfQotICAgICAqCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB0eXBlIGxpdGVyYWwuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuYW1lIG9mIHRoZSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IHR5cGUgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFR5cGVMaXRlcmFsIGNyZWF0ZVR5cGVMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCi0gICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCIuIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgdHlwZUxpdGVyYWwuc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSh2YWx1ZSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWFsaWZpZXIgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGFzdEluZGV4T2YoIi4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIFN0cmluZyBpZGVudGlmaWVyID0gdmFsdWUuc3Vic3RyaW5nKHZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKHF1YWxpZmllci5lcXVhbHMoImphdmEubGFuZyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB0eXBlTGl0ZXJhbC5zZXRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKGlkZW50aWZpZXIpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHR5cGVMaXRlcmFsLnNldFR5cGUoYXN0Lm5ld1F1YWxpZmllZFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUocXVhbGlmaWVyKSksIGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1NpbXBsZU5hbWUoaWRlbnRpZmllcikpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHlwZUxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU3RyaW5nTGl0ZXJhbH0uCi0gICAgICogQHBhcmFtIGFzdCB0aGUge0BsaW5rIEFTVH0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBzdHJpbmcgbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gbGl0ZXJhbFZhbHVlIHRoZSBzdHJpbmcgdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBzdHJpbmcgbGl0ZXJhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0xpdGVyYWwgY3JlYXRlU3RyaW5nTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgbGl0ZXJhbFZhbHVlKSB7Ci0gICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0gICAgICAgIHN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKGxpdGVyYWxWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBzdHJpbmdMaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEJvb2xlYW5MaXRlcmFsfS4KLSAgICAgKiBAcGFyYW0gYXN0IHRoZSB7QGxpbmsgQVNUfSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGJvb2xlYW4gbGl0ZXJhbC4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGJvb2xlYW4gdmFsdWUuCi0gICAgICogQHJldHVybiBhIG5ldyBib29sZWFuIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBCb29sZWFuTGl0ZXJhbCBjcmVhdGVCb29sZWFuTGl0ZXJhbChBU1QgYXN0LCBib29sZWFuIHZhbHVlKSB7Ci0gICAgICAgIEJvb2xlYW5MaXRlcmFsIGJvb2xlYW5MaXRlcmFsID0gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGJvb2xlYW5MaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE51bWJlckxpdGVyYWx9LgotICAgICAqIEBwYXJhbSBhc3QgdGhlIHtAbGluayBBU1R9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIE51bWJlckxpdGVyYWx9LgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbnVtYmVyIHZhbHVlLgotICAgICAqIEByZXR1cm4gYSBuZXcgbnVtYmVyIGxpdGVyYWwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOdW1iZXJMaXRlcmFsIGNyZWF0ZU51bWJlckxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIE51bWJlckxpdGVyYWwgcHJpbWl0aXZlTGl0ZXJhbCA9IGFzdC5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0gICAgICAgIHByaW1pdGl2ZUxpdGVyYWwuc2V0VG9rZW4odmFsdWUpOwotICAgICAgICByZXR1cm4gcHJpbWl0aXZlTGl0ZXJhbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0NvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDA0Njc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIAotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyAKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbnNDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25zQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzgzODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBhbm5vdGF0aW9uIGNhdGVnb3JpZXMsIGRlZmluaXRpb25zLCBwcm9jZXNzb3JzIGFuZCBpbml0aWFsaXplcnMgY29udHJpYnV0ZWQgdGhyb3VnaCB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiwKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25DYXRlZ29yeTwvY29kZT4sCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGFuZAotICogPGNvZGU+b3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvblByb2Nlc3NvcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50cy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uc01hbmFnZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0RFRklOSVRJT04gPSAiYW5ub3RhdGlvbkRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRJT05fQ0FURUdPUlkgPSAiYW5ub3RhdGlvbkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0lOSVRJQUxJWkVSID0gImFubm90YXRpb25Jbml0aWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9QUk9DRVNTT1IgPSAiYW5ub3RhdGlvblByb2Nlc3NvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTiA9ICJhbm5vdGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFubm90YXRpb25DYXRlZ29yeUNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlID0gbnVsbDsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4+IGFubm90YXRpb25zQnlDYXRlZ29yeU1hcCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uUXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1RBUkdFVF9GSUxURVIgPSAidGFyZ2V0RmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUID0gInRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNNYW5hZ2VyKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gY29uc3RydWN0ZWQgZnJvbSBjb250cmlidXRpb25zIHRvIHRoZQotICAgICAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25EZWZpbml0aW9uPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkNhY2hlID09IG51bGwpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25DYWNoZSA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fREVGSU5JVElPTik7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gZXh0ZW5zaW9uUG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEFOTk9UQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IG5ldyBBbm5vdGF0aW9uRGVmaW5pdGlvbihlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9uQ2F0ZWdvcnkoZ2V0QXR0cmlidXRlVmFsdWUoZWxlbWVudCwgQVRUX0NBVEVHT1JZKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhY2hlLmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DYWNoZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGNvbnRyaWJ1dGVkIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSB0aGF0IHRhcmdldCB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZWxlbWVudCBvbmUgb2YKLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkPC9saT4KLSAgICAgKiA8bGk+b3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDwvbGk+Ci0gICAgICogPGxpPm9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlPC9saT4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldEFubm90YXRpb25zKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4oKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QWxsQW5ub3RhdGlvbnNGb3JFbGVtZW50KGphdmFFbGVtZW50KTsKLQotICAgICAgICAgICAgZmlsdGVyQW5ub3RhdGlvbnNMaXN0KGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25Ub0NsYXNzTmFtZURlZmluaXRpb25NYXAoKSB7Ci0KLSAgICAgICAgaWYgKGFubm90YXRpb25DbGFzc05hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvbkNsYXNzTmFtZVRvRGVmaW5pdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBhbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldENhbm9uaWNhbE5hbWUoKSwgYW5ub3RhdGlvbkRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2xhc3NOYW1lVG9EZWZpbml0aW9uTWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID09IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IGdldEFubm90YXRpb25zKCk7Ci0KLSAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQotICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwLnB1dChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXROYW1lKCksIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblNpbXBsZU5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zID0gZ2V0QW5ub3RhdGlvbnMoKTsKLQotICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25EZWZpbml0aW9uPigpOwotCi0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogYW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXAucHV0KGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25DbGFzc05hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblF1YWxpZmllZE5hbWVUb0RlZmluaXRpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFubm90YXRpb25EZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9yIG51bGwgaWYgbm8gYW5ub3RhdGlvbiBkZWZpbml0aW9uIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5qYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPC9jb2RlPiBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvblRvQ2xhc3NOYW1lRGVmaW5pdGlvbk1hcCgpLmdldChhbm5vdGF0aW9uQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW5ub3RhdGlvbkRlZmluaXRpb259IGZvciB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG5hbWUgb3IgbnVsbCBpZiBubyBhbm5vdGF0aW9uIGRlZmluaXRpb24gY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBjYW5vbmljYWxOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgPGNvZGU+amF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjwvY29kZT4gY2xhc3MuCi0gICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbiBkZWZpbml0aW9uIGZvciB0aGUgZnVsbHkgcXVhbGlmaWVkIDxjb2RlPmphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb248L2NvZGU+IGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKFN0cmluZyBjYW5vbmljYWxOYW1lKSB7Ci0gICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uVG9DbGFzc05hbWVEZWZpbml0aW9uTWFwKCkuZ2V0KGNhbm9uaWNhbE5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyfSBmb3IgdGhlIGdpdmVuIHtAbGluayBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZX0KLSAgICAgKiBvciBudWxsIGlmIG5vbmUgY2FuIGJlIGZvdW5kLgotICAgICAqIEBwYXJhbSBuYW1lIGEge0BsaW5rIFNpbXBsZU5hbWV9IG9yIHtAbGluayBRdWFsaWZpZWROYW1lfSBmb3IgdGhlIGFubm90YXRpb24gdG8gc2VhcmNoIGZvci4KLSAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShOYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG5hbWUuaXNTaW1wbGVOYW1lKCkgJiYgZ2V0U2ltcGxlTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmNvbnRhaW5zS2V5KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTaW1wbGVOYW1lVG9EZWZpbml0aW9uTWFwKCkuZ2V0KCgoU2ltcGxlTmFtZSkgbmFtZSkuZ2V0SWRlbnRpZmllcigpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5pc1F1YWxpZmllZE5hbWUoKSAmJiBnZXRRdWFsaWZpZWROYW1lVG9EZWZpbml0aW9uTWFwKCkuY29udGFpbnNLZXkobmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVRvRGVmaW5pdGlvbk1hcCgpLmdldChuYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKS5nZXRBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBBbm5vdGF0aW9uRGVmaW5pdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBjYXRlZ29yeSBuYW1lLgotICAgICAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgdGhlIGFubm90YXRpb24gY2F0ZWdvcnkgbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9uIGRlZmluaXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25zQnlDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNCeUNhdGVnb3J5TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPj4oKTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gOiBnZXRBbm5vdGF0aW9ucygpKSB7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QgPSBhbm5vdGF0aW9uc0J5Q2F0ZWdvcnlNYXAuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5wdXQoYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q2F0ZWdvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbkxpc3QpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmluaXRpb25MaXN0LmFkZChhbm5vdGF0aW9uRGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zQnlDYXRlZ29yeU1hcC5nZXQoY2F0ZWdvcnlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgYW5ub3RhdGlvbiBjYXRlZ29yaWVzLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFubm90YXRpb24gY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS52YWx1ZXMoKS50b0FycmF5KAotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5zaXplKCldKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFubm90YXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCkgewotICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKS5nZXQoY2F0ZWdvcnlJZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0QW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGU7Ci0gICAgICAgIH0KLQotICAgICAgICBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQU5OT1RBVElPTl9DQVRFR09SWSk7Ci0gICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvblBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkNhdGVnb3J5Q2FjaGUucHV0KGdldEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIEFUVF9JRCksCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBVFRfTkFNRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uQ2F0ZWdvcnlDYWNoZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGdldEFubm90YXRpb25Jbml0aWFsaXplckNhY2hlKCkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5ub3RhdGlvbkluaXRpYWxpemVyQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQotICAgICAgICBJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fSU5JVElBTElaRVIpOwotICAgICAgICBpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25Jbml0aWFsaXplckNhY2hlLnB1dChnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5pdGlhbGl6ZXJDYWNoZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGdldEFubm90YXRpb25Qcm9jZXNzb3JzQ2FjaGUoKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUgPT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+KCk7Ci0KLSAgICAgICAgICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEFOTk9UQVRJT05fUFJPQ0VTU09SKTsKLSAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwcm9jZXNzb3IiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25LZXkgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbGVtZW50LCBBTk5PVEFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWd1cmF0aW9uRWxlbWVudHMgPSBhbm5vdGF0aW9uUHJvY2Vzc29yQ2FjaGUuZ2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uRWxlbWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25FbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLnB1dChhbm5vdGF0aW9uS2V5LCBjb25maWd1cmF0aW9uRWxlbWVudHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkVsZW1lbnRzLmFkZChlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlOwotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBTdHJpbmcgYXR0cmlidXRlID0gY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnNGb3JFbGVtZW50KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkKLSAgICB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5QQUNLQUdFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzQW5ub3RhdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlRZUEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5GSUVMRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnNGb3JFbGVtZW50VHlwZShFbGVtZW50VHlwZS5NRVRIT0QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUxvY2FsVmFyaWFibGUpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25zRm9yRWxlbWVudFR5cGUoRWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBnZXRBbm5vdGF0aW9uc0ZvckVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+KCk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRpb25DYWNoZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRBbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25DYWNoZSkgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKS5jb250YWlucyhlbGVtZW50VHlwZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlzRGVwcmVjYXRlZChhbm5vdGF0aW9uRGVmaW5pdGlvbikpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGVmaW5pdGlvbnMuYWRkKGFubm90YXRpb25EZWZpbml0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmlsdGVyQW5ub3RhdGlvbnNMaXN0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEl0ZXJhdG9yPEFubm90YXRpb25EZWZpbml0aW9uPiBhbm5vdGF0aW9uSXRlciA9IGFubm90YXRpb25EZWZpbml0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoYW5ub3RhdGlvbkl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IGFubm90YXRpb25JdGVyLm5leHQoKTsKLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoaXNDbGFzc1Jlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0ludGVyZmFjZVJlc3RyaWN0ZWQodHlwZSwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0VudW1SZXN0cmljdGVkKHR5cGUsIGFubm90YXRpb25EZWZpbml0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01haW5NZXRob2QoKSkgewotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uSXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRUYXJnZXRzKCkuY29udGFpbnMoRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc0NsYXNzUmVzdHJpY3RlZChtZXRob2QsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0VudW1SZXN0cmljdGVkKG1ldGhvZCwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgaWYoaXNDbGFzc1Jlc3RyaWN0ZWQoamF2YUVsZW1lbnQsIGFubm90YXRpb25EZWZpbml0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNJbnRlcmZhY2VSZXN0cmljdGVkKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uRGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8aXNFbnVtUmVzdHJpY3RlZChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkRlZmluaXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDbGFzc1Jlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzQ2xhc3MoKSAmJiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5pc0NsYXNzT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIHJldHVybiAhdHlwZS5pc0NsYXNzKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNDbGFzc09ubHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ludGVyZmFjZVJlc3RyaWN0ZWQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgcmV0dXJuICEoKElUeXBlKWphdmFFbGVtZW50KS5pc0ludGVyZmFjZSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzSW50ZXJmYWNlT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNJbnRlcmZhY2UoKSAgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNJbnRlcmZhY2VPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzSW50ZXJmYWNlKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNJbnRlcmZhY2VPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFbnVtUmVzdHJpY3RlZChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICByZXR1cm4gISgoSVR5cGUpamF2YUVsZW1lbnQpLmlzRW51bSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzRW51bU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKWphdmFFbGVtZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgcmV0dXJuICF0eXBlLmlzRW51bSgpICYmIGFubm90YXRpb25EZWZpbml0aW9uLmlzRW51bU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICByZXR1cm4gIXR5cGUuaXNFbnVtKCkgJiYgYW5ub3RhdGlvbkRlZmluaXRpb24uaXNFbnVtT25seSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL1RPRE8gTW92ZSB0aGUgRGVwcmVjYXRlZCBvcHRpb24gdG8gcHJlZmVyZW5jZXMKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVwcmVjYXRlZChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgewotICAgICAgICBDbGFzczw/PiBhbm5vdGF0aW9uQ2xhc3MgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uQ2xhc3MoKTsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzcy5nZXRBbm5vdGF0aW9uKGphdmEubGFuZy5EZXByZWNhdGVkLmNsYXNzKSAhPSBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL2luaXRpYWxpemF0aW9uL0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjQzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBpbml0aWFsaXplcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uSW5pdGlhbGl6ZXI8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqIDxwPgotICogUHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzLgotICogPC9wPgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbAotICogYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0qLwotcHVibGljIGNsYXNzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19JREVOVElGRVIgPSAiJG1pc3NpbmckIjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciNnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCwgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcikKLQkgKi8KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIjZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvclNpbmdsZU1lbWJlckFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikKLQkgKi8KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIHNpbmdsZU1lbWJlckFubm90YXRpb24pIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwgRXhwcmVzc2lvbiB2YWx1ZSkgewotICAgICAgICBJbWFnZSBpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2Uob3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpOwotICAgICAgICByZXR1cm4gY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCB2YWx1ZSwgaW1hZ2UsIHByb3Bvc2FsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIEV4cHJlc3Npb24gdmFsdWUsIEltYWdlIGltYWdlLAotICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLSAgICAgICAgaW50IHJlcGxhY2VtZW50T2Zmc2V0ID0gdmFsdWUuZ2V0U3RhcnRQb3NpdGlvbigpOwotICAgICAgICBpbnQgcmVwbGFjZW1lbnRMZW5ndGggPSAwOwotICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoTUlTU0lOR19JREVOVElGRVIpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcG9zYWwuY2hhckF0KDApICE9ICdcIicpIHsKLSAgICAgICAgICAgICAgICBwcm9wb3NhbCA9ICJcIiIgKyBwcm9wb3NhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcm9wb3NhbC5jaGFyQXQocHJvcG9zYWwubGVuZ3RoKCkgLSAxKSAhPSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgcHJvcG9zYWwgPSBwcm9wb3NhbCArICJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXBsYWNlbWVudE9mZnNldCArPSAxOwotICAgICAgICAgICAgcmVwbGFjZW1lbnRMZW5ndGggPSB2YWx1ZS5nZXRMZW5ndGgoKSAtIDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbCwgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBwcm9wb3NhbC5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICBpbWFnZSwgZGlzcGxheVN0cmluZywgbnVsbCwgbnVsbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiNWJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9EZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotCi0vKioKLSAqIENvbnN0cnVjdHMge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gZnJvbSB0aGUgZGVmYXVsdHMgZm91bmQgaW4gdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufS4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0c0Fubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBwdWJsaWMgRGVmYXVsdHNBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdXNpbmcgdGhlIGRlY2xhcmVkIG1ldGhvZCBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgaW4KLSAgICAgKiB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259LgotICAgICAqICBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIjZ2V0TWVtYmVyVmFsdWVQYWlycyhvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQsIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1QsIGphdmEubGFuZy5DbGFzcykKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICByZXR1cm4gZ2V0TWVtYmVyVmFsdWVQYWlycyhhc3QsIGFubm90YXRpb25DbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1ldGhvZFtdIGRlY2xhcmVkTWV0aG9kcyA9IGFubm90YXRpb25DbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogZGVjbGFyZWRNZXRob2RzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCBkZWZhdWx0VmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGRlZmF1bHRWYWx1ZS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUJvb2xlYW5NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIEJvb2xlYW4ucGFyc2VCb29sZWFuKGRlZmF1bHRWYWx1ZS50b1N0cmluZygpKSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoTG9uZy5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTnVtYmVyTWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgZGVmYXVsdFZhbHVlLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFycmF5TWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0W10pIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzRW51bSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksIG5hbWUsIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVR5cGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvYW5ub3RhdGlvbnMvY29yZS9pbml0aWFsaXphdGlvbi9JQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDgxYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvaW5pdGlhbGl6YXRpb24vSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGluaXRpYWxpemVycyBjb250cmlidXRlZCB0byB0aGUKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplcjwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHRoYXQgbWF5IGJlIGFkZGVkIHRvIGEge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotCSAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IG9uIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkLgotCSAqIEBwYXJhbSBhc3QgdGhlIDxjb2RlPkFTVDwvY29kZT4gd2l0aCB3aGljaCB0byBjcmVhdGUgdGhlIG1lbWJlciB2YWx1ZSBwYWlycy4KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbkNsYXNzIHRoZSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3Mgd2hpY2ggbWF5IGJlCi0JICogdXNlZCB0byBxdWVyeSB0aGUgZGVjbGFyZWQgbWVtYmVycyBvZiB0aGUgYW5ub3RhdGlvbiB0eXBlIGFuZCB0aGUgbWVtYmVycyBkZWZhdWx0IHZhbHVlcy4KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZW1iZXIgdmFsdWUgcGFpcnMuCi0JICovCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBwcm92aWRlIGEgbGlzdCBvZiB7QGxpbmsgSUNvbXBsZXRpb25Qcm9wb3NhbH0gZm9yIGEge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdmFsdWUuCi0JICogQHBhcmFtIGphdmFFbGVtZW50IHRoZSBqYXZhIGVsZW1lbnQgb24gd2hpY2ggdGhlIGFubm90YXRpb24gaXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgaW4gd2hpY2ggY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQuCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgY29tcGxldGlvbiBwcm9wb3NhbHMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKTsKLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2Yge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWx9IGZvciBhIHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufSB2YWx1ZS4KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCBvbiB3aGljaCB0aGUgYW5ub3RhdGlvbiBpcyBkZWNsYXJlZC4KLSAgICAgKiBAcGFyYW0gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIGluIHdoaWNoIGNvbnRlbnQgYXNzaXN0IHdhcyBpbnZva2VkLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIFNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbik7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fic3RyYWN0QW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTcyNDdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuRWNsaXBzZU1lc3NhZ2VyOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBjb20uc3VuLm1pcnJvci51dGlsLlNvdXJjZVBvc2l0aW9uOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb2Nlc3NvcnMgY29udHJpYnV0ZWQgdG8gdGhlCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uUHJvY2Vzc29yPC9jb2RlPiBleHRlbnNpb24gcG9pbnQuCi0gKgotICogPHA+Ci0gKiA8c3Ryb25nPlByb3Zpc2lvbmFsIEFQSTo8L3N0cm9uZz4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQKLSAqIHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMKLSAqIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVudmlyb25tZW50OwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSB7QGxpbmsgQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50fSBlbnZpcm9ubWVudCB0byB1c2UgZHVyaW5nIHByb2Nlc3NpbmcuCi0gICAgICogQHBhcmFtIGVudmlyb25tZW50IHRoZSBhbm5vdGF0aW9uIHByb2Nlc3NvciBlbnZpcm9ubWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQoQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVudmlyb25tZW50KSB7Ci0gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm9jZXNzIGFsbCBwcm9ncmFtIGVsZW1lbnRzIHN1cHBvcnRlZCBieSB0aGlzIGFubm90YXRpb24gcHJvY2Vzc29yLgotICAgICAqIAotICAgICAqIEBzZWUgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEVycm9yKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpLnByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhbiBlcnJvciBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludEVycm9yKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSB3YXJuaW5nIG9jY3VyZWQsIG9yIG51bGwgaWYgaXQgaXMgdW5rbm93biBvciBub3QgYXBwbGljYWJsZQotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50V2FybmluZyhTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbm90aWNlLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5vdGljZSBvY2N1cmVkLCBvciBudWxsIGlmIGl0IGlzIHVua25vd24gb3Igbm90IGFwcGxpY2FibGUKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vbmUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludE5vdGljZShTb3VyY2VQb3NpdGlvbiBwb3NpdGlvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKS5wcmludE5vdGljZShwb3NpdGlvbiwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnRzIGEgbm90aWNlLgotICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50Tm90aWNlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UobWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIGVycm9yCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlRXJyb3IocG9zaXRpb24sIG1lc3NhZ2UsICIiLCBtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIGVycm9yCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlRXJyb3IoU291cmNlUG9zaXRpb24gcG9zaXRpb24sIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlRXJyb3IocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYW4gZXJyb3IgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVFcnJvcihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZUVycm9yKG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb24gcG9zaXRpb24gb2YgdGhlIHdhcm5pbmcKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZVdhcm5pbmcocG9zaXRpb24sIG1lc3NhZ2UsIHBsdWdpbklkLCBlcnJvcklkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50V2FybmluZyhwb3NpdGlvbiwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIHdhcm5pbmcgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVXYXJuaW5nKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBlcnJvcklkKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpIGluc3RhbmNlb2YgRWNsaXBzZU1lc3NhZ2VyKSB7Ci0gICAgICAgICAgICBFY2xpcHNlTWVzc2FnZXIgbWVzc2FnZXIgPSAoRWNsaXBzZU1lc3NhZ2VyKSBlbnZpcm9ubWVudC5nZXRNZXNzYWdlcigpOwotICAgICAgICAgICAgbWVzc2FnZXIucHJpbnRGaXhhYmxlV2FybmluZyhtZXNzYWdlLCBwbHVnaW5JZCwgZXJyb3JJZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludFdhcm5pbmcobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhIG5vdGljZSBpbmNsdWRpbmcgdGhlIGdpdmVuIGFyZ3VtZW50cyBmb3IgdXNlIGluIHF1aWNrLWZpeGVzLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbiBwb3NpdGlvbiBvZiB0aGUgbm90aWNlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHRoZSB1c2VyCi0gICAgICogQHBhcmFtIHBsdWdpbklkIHBsdWctaW4gd2hpY2ggd2lsbCBwcm92aWRlIGEgamF2YSBxdWljayBmaXggcHJvY2Vzc29yIGZvciB0aGlzIGVycm9yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKiBAcGFyYW0gZXJyb3JJZCBhIHBsdWctaW4gcHJvdmlkZWQgZXJyb3IgY29kZSB3aGljaCB3aWxsIGJlIG1lYW5pbmdmdWwgdG8gdGhlIGphdmEgcXVpY2sgZml4IHByb2Nlc3Nvci4gQ2Fubm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRGaXhhYmxlTm90aWNlKFNvdXJjZVBvc2l0aW9uIHBvc2l0aW9uLCBTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXJyb3JJZCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKSBpbnN0YW5jZW9mIEVjbGlwc2VNZXNzYWdlcikgewotICAgICAgICAgICAgRWNsaXBzZU1lc3NhZ2VyIG1lc3NhZ2VyID0gKEVjbGlwc2VNZXNzYWdlcikgZW52aXJvbm1lbnQuZ2V0TWVzc2FnZXIoKTsKLSAgICAgICAgICAgIG1lc3NhZ2VyLnByaW50Rml4YWJsZU5vdGljZShwb3NpdGlvbiwgbWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnROb3RpY2UocG9zaXRpb24sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgYSBub3RpY2UgaW5jbHVkaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMgZm9yIHVzZSBpbiBxdWljay1maXhlcy4KLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLSAgICAgKiBAcGFyYW0gcGx1Z2luSWQgcGx1Zy1pbiB3aGljaCB3aWxsIHByb3ZpZGUgYSBqYXZhIHF1aWNrIGZpeCBwcm9jZXNzb3IgZm9yIHRoaXMgZXJyb3IuIENhbm5vdCBiZSBudWxsLgotICAgICAqIEBwYXJhbSBlcnJvcklkIGEgcGx1Zy1pbiBwcm92aWRlZCBlcnJvciBjb2RlIHdoaWNoIHdpbGwgYmUgbWVhbmluZ2Z1bCB0byB0aGUgamF2YSBxdWljayBmaXggcHJvY2Vzc29yLiBDYW5ub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludEZpeGFibGVOb3RpY2UoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGVycm9ySWQpIHsKLSAgICAgICAgaWYgKGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCkgaW5zdGFuY2VvZiBFY2xpcHNlTWVzc2FnZXIpIHsKLSAgICAgICAgICAgIEVjbGlwc2VNZXNzYWdlciBtZXNzYWdlciA9IChFY2xpcHNlTWVzc2FnZXIpIGVudmlyb25tZW50LmdldE1lc3NhZ2VyKCk7Ci0gICAgICAgICAgICBtZXNzYWdlci5wcmludEZpeGFibGVOb3RpY2UobWVzc2FnZSwgcGx1Z2luSWQsIGVycm9ySWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnROb3RpY2UobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9hbm5vdGF0aW9ucy9jb3JlL3V0aWxzL0Fubm90YXRpb25VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTAzM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2Fubm90YXRpb25zL2NvcmUvdXRpbHMvQW5ub3RhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDLCBTaGFuZSBDbGFya2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBTaGFuZSBDbGFya2UgLSBSZXdyb3RlIEFQSQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQgdXBkYXRpbmcgYW5ub3RhdGlvbnMgYW5kIG1lbWJlciB2YWx1ZSBwYWlycy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBbm5vdGF0aW9uVXRpbHMgewotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQgb2YgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgamF2YSBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSBjb21waWxhdGlvbiB1bml0IHRvIGFkZCB0aGUgaW1wb3J0IHRvLgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgaW1wb3J0IHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBJbXBvcnQiLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgYXBwbHlDaGFuZ2UobnVsbCwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFuIGltcG9ydCBmcm9tIHRoZSBjb21waWxhdGlvbiB1bml0IG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fS4gVGhlIGltcG9ydCB3aWxsIG5vdCBiZSByZW1vdmVkIGlmIHRoZQotICAgICAqIGltcG9ydCB0eXBlIGlzIHJlZmVyZW5jZWQgb24gbW9yZSB0aGFuIG9uZSBhbm5vdGF0YWJsZSBlbGVtZW50IGluIHRoZSBzb3VyY2UgY29kZS4gVGhpcyBtZXRob2QKLSAgICAgKiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIEFubm90YXRpb25VdGlscyNyZW1vdmVBbm5vdGF0aW9uKElKYXZhRWxlbWVudCwgQW5ub3RhdGlvbil9fS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB3aGljaCBpcyB1c2VkIHRvIGdldCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byByZW1vdmUgdGhlIGltcG9ydCBmcm9tLgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgamF2YSBlbGVtZW50cyBhcmUgc3VwcG9ydGVkOgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZSB0aGUgaW1wb3J0IHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbXBvcnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIlJlbW92ZSBJbXBvcnQiLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgcXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgYXBwbHlDaGFuZ2UobnVsbCwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIHRoZSBnaXZlbiB7QGxpbmsgQW5ub3RhdGlvbn0gdG8gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIGFubm90YXRpb24iLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCBhbm5vdGF0aW9uRWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4ge0BsaW5rIEFubm90YXRpb259IGZyb20gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudHMgYXJlIHN1cHBvcnRlZDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIHJlbW92ZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiUmVtb3ZlIGFubm90YXRpb24iLCAoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBUZXh0RWRpdCB0ZXh0RWRpdCA9IEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjaGFuZ2UuYWRkRWRpdCh0ZXh0RWRpdCk7Ci0gICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdG8gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gYWRkIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0by4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byBhZGQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRSb290KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBhbm5vdGF0aW9uLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSBmcm9tIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBtZW1iZXIgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW0gbWVtYmVyVmFsdWVQYWlyIHRoZSBtZW1iZXIgdmFsdWUgcGFpciB0byByZW1vdmUuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvbi5nZXRSb290KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSBhbm5vdGF0aW9uLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiUmVtb3ZlIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgQVNUTm9kZX0uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4gdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0Um9vdCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgbWVtYmVyVmFsdWVQYWlyLmdldFJvb3QoKTsKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiVXBkYXRlIE1lbWJlciBWYWx1ZSBQYWlyIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQobWVtYmVyVmFsdWVQYWlyLCB2YWx1ZSk7Ci0gICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChhbm5vdGF0aW9uRWRpdCk7Ci0gICAgICAgICAgICBhcHBseUNoYW5nZShudWxsLCBjaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIHtAbGluayBTaW5nbGVNZW1iZXJBbm5vdGF0aW9ufSB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgQVNUTm9kZX0uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gQSB7QGxpbmsgSmF2YU1vZGVsRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hlbiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cwotICAgICAqIGJ1ZmZlciBjb3VsZCBub3QgYmUgYWNjZXNzZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBBU1ROb2RlIHZhbHVlKSAgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uLmdldFJvb3QoKSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChDb21waWxhdGlvblVuaXQpIGFubm90YXRpb24uZ2V0Um9vdCgpOwotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJVcGRhdGUgU2luZ2xlIE1lbWJlciBBbm5vdGF0aW9uIiwgKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgICAgICBjaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICAgICAgVGV4dEVkaXQgYW5ub3RhdGlvbkVkaXQgPSBBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KGFubm90YXRpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KGFubm90YXRpb25FZGl0KTsKLSAgICAgICAgICAgIGFwcGx5Q2hhbmdlKG51bGwsIGNoYW5nZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRFZGl0fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBhZGQgaW1wb3J0IGNoYW5nZSB0byB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGphdmEgZWxlbWVudHMgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBUaGUgY29tcGlsYXRpb24gdW5pdCBpdHNlbGYgaXMgbm90IG1vZGlmaWVkLgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIDxwPgotICAgICAqIFRoZSBqYXZhIGVsZW1lbnQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdoaWNoIHdpbGwgaW4gdHVybiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiB7QGxpbmsgSW1wb3J0UmV3cml0ZX0uCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHRoZSBpbXBvcnQgdG8gYWRkLgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBhZGQgaW1wb3J0IGNoYW5nZXMuCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBpbXBvcnQgcmV3cml0ZSBmYWlscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgU3RyaW5nIHF1YWxpZmllZE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgcmV0dXJuIGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVtb3ZlIGltcG9ydCBjaGFuZ2UgdG8gdGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBqYXZhIGVsZW1lbnRzIGNvbXBpbGF0aW9uIHVuaXQuCi0gICAgICogVGhlIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4gTm8gY2hhbmdlIHdpbGwgYmUgcmVjb3JkZWQgaWYgdGhlIGltcG9ydCB0eXBlIGlzIHJlZmVyZW5jZWQgb24gbW9yZSB0aGFuIG9uZSBhbiBhbm5vdGF0YWJsZQotICAgICAqIGVsZW1lbnQgaW4gdGhlIHNvdXJjZSBjb2RlLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIGNvbmp1bmN0aW9uIHdpdGgge0BsaW5rIEFubm90YXRpb25VdGlscyNjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSUphdmFFbGVtZW50LCBBbm5vdGF0aW9uKX19LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIDxwPgotICAgICAqIFRoZSBqYXZhIGVsZW1lbnQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIHtAbGluayBDb21waWxhdGlvblVuaXR9IHdoaWNoIHdpbGwgaW4gdHVybiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiB7QGxpbmsgSW1wb3J0UmV3cml0ZX0uCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBxdWFsaWZpZWROYW1lIHRoZSBhbm5vdGF0aW9uIGltcG9ydCB0byByZW1vdmUuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlbW92ZSBpbXBvcnQgY2hhbmdlcy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGltcG9ydCByZXdyaXRlIGZhaWxzLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKGdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCksIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKHF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKSArIDEpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gb2NjdXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA9IEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNsYXNzKHF1YWxpZmllZE5hbWUpOwotICAgICAgICBMaXN0PEVsZW1lbnRUeXBlPiBlbGVtZW50VHlwZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25EZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVsZW1lbnRUeXBlcyA9IGFubm90YXRpb25EZWZpbml0aW9uLmdldFRhcmdldHMoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlIDogZWxlbWVudFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGUuUEFDS0FHRSkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhwYWNrYWdlRGVjbGFyYXRpb24uYW5ub3RhdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGUuVFlQRSkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLkZJRUxEKSB7Ci0gICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25TaW1wbGVOYW1lLCBvY2N1cmVuY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlLk1FVEhPRCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY291bnRBbm5vdGF0aW9uT2NjdXJyZW5jZXMobWV0aG9kRGVjbGFyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uU2ltcGxlTmFtZSwgb2NjdXJlbmNlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZS5QQVJBTUVURVIpIHsKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tb2RpZmllcnMoKSwgYW5ub3RhdGlvblNpbXBsZU5hbWUsIG9jY3VyZW5jZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9jY3VyZW5jZXMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgIGltcG9ydFJld3JpdGUucmVtb3ZlSW1wb3J0KHF1YWxpZmllZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8gQ2xlYW51cCBpbXBvcnRzLiBSZXBlYXRlZGx5IGFkZGluZyBhbmQgcmVtb3ZpbmcgYW4gaW1wb3J0Ci0gICAgICAgIC8vIHdoZXJlIG5vbmUgZXhpc3RlZCBiZWZvcmUgd2lsbAotICAgICAgICAvLyBpbnNlcnQgYSBuZXcgbGluZSBvbiBlYWNoIGluc2VydC4KLSAgICAgICAgcmV0dXJuIGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3VudEFubm90YXRpb25PY2N1cnJlbmNlcyhMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBtb2RpZmllcnMsIFN0cmluZyBhbm5vdGF0aW9uU2ltcGxlTmFtZSwKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBvY2N1cmVuY2VzKSB7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IG1vZGlmaWVycykgewotICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBleGlzdGluZ0Fubm90YXRpb24gPSAoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcjsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKGFubm90YXRpb25TaW1wbGVOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICBvY2N1cmVuY2VzLmFkZChhbm5vdGF0aW9uU2ltcGxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotICAgICAqIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlcy4gUmV0dXJucyBhIHtAbGluayBNdWx0aVRleHRFZGl0fSBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGlzbid0IHN1cHBvcnRlZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJUGFja2FnZURlY2xhcmF0aW9uKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJVHlwZSkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoKElGaWVsZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KChJTWV0aG9kKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdCgoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVtb3ZlIGFubm90YXRpb24gY2hhbmdlIHRvIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgamF2YSBlbGVtZW50cyBjb21waWxhdGlvbiB1bml0LgotICAgICAqIFRoZSBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uIHRvIGFkZC4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgYWRkIGFubm90YXRpb24gY2hhbmdlcy4gUmV0dXJucyBhIHtAbGluayBNdWx0aVRleHRFZGl0fSBpZiB0aGUgZ2l2ZW4gamF2YSBlbGVtZW50IGlzbid0IHN1cHBvcnRlZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXRzCi0gICAgICogYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT046Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJUGFja2FnZURlY2xhcmF0aW9uKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LlRZUEU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJVHlwZSkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5GSUVMRDoKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoKElGaWVsZCkgamF2YUVsZW1lbnQsIGFubm90YXRpb24pOwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5NRVRIT0Q6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KChJTWV0aG9kKSBqYXZhRWxlbWVudCwgYW5ub3RhdGlvbik7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdCgoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50LCBhbm5vdGF0aW9uKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyID0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSBjaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IGNoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAocGFja2FnZURlY2xhcmF0aW9uICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQocGFja2FnZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IGdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChwYWNrYWdlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShjb21waWxhdGlvblVuaXQuZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCksIFBhY2thZ2VEZWNsYXJhdGlvbi5BTk5PVEFUSU9OU19QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEZpcnN0KGFubm90YXRpb24sIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQocGFja2FnZURlY2xhcmF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gZ2V0Q29tcGlsYXRpb25Vbml0RnJvbUphdmFFbGVtZW50KHBhY2thZ2VEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwa2dEZWNsYXJhdGlvbiA9IGNvbXBpbGF0aW9uVW5pdC5nZXRQYWNrYWdlKCk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUocGtnRGVjbGFyYXRpb24sIFBhY2thZ2VEZWNsYXJhdGlvbi5BTk5PVEFUSU9OU19QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pIG9iamVjdCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKChBbm5vdGF0aW9uKSBvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElUeXBlIHR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbih0eXBlKTsKLSAgICAgICAgaWYodHlwZURlY2xhcmF0aW9uICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQodHlwZSwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZSh0eXBlRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKHR5cGVEZWNsYXJhdGlvbiwgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yVHlwZSh0eXBlRGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QoYW5ub3RhdGlvbiwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElUeXBlIHR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbih0eXBlKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQodHlwZSwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZSh0eXBlRGVjbGFyYXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKHR5cGVEZWNsYXJhdGlvbiwgZ2V0Q2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yRm9yVHlwZSh0eXBlRGVjbGFyYXRpb24pKTsKLQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICBMaXN0IG9yaWdpbmFsTGlzdCA9IGxpc3RSZXdyaXRlLmdldE9yaWdpbmFsTGlzdCgpOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFubm90YXRpb24gJiYgY29tcGFyZUFubm90YXRpb25OYW1lcygoQW5ub3RhdGlvbilvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbilvYmplY3QsIG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KElNZXRob2QgbWV0aG9kLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShtZXRob2REZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUobWV0aG9kRGVjbGFyYXRpb24sICBNZXRob2REZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLQotICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QXQoYW5ub3RhdGlvbiwgMCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElNZXRob2QgbWV0aG9kLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsICYmIGlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKG1ldGhvZERlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShtZXRob2REZWNsYXJhdGlvbiwgIE1ldGhvZERlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKSBvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbikgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJRmllbGQgZmllbGQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IGdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQpOwotICAgICAgICBpZiAoZmllbGREZWNsYXJhdGlvbiAhPSBudWxsICYmICFpc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBhbm5vdGF0aW9uKSkgewotCi0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoZmllbGREZWNsYXJhdGlvbi5nZXRBU1QoKSk7Ci0KLSAgICAgICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoZmllbGREZWNsYXJhdGlvbiwgRmllbGREZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZKTsKLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIDAsIG51bGwpOwotCi0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KElGaWVsZCBmaWVsZCwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uID0gZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCk7Ci0gICAgICAgIGlmIChmaWVsZERlY2xhcmF0aW9uICE9IG51bGwgJiYgaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgYW5ub3RhdGlvbikpIHsKLSAgICAgICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShmaWVsZERlY2xhcmF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShmaWVsZERlY2xhcmF0aW9uLCBGaWVsZERlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFkpOwotCi0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgIExpc3Qgb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBvcmlnaW5hbExpc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbiAmJiBjb21wYXJlQW5ub3RhdGlvbk5hbWVzKChBbm5vdGF0aW9uKSBvYmplY3QsIGFubm90YXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RSZXdyaXRlLnJlbW92ZSgoQW5ub3RhdGlvbikgb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFRleHRFZGl0IGNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChJTG9jYWxWYXJpYWJsZSBtZXRob2RQYXJhbWV0ZXIsIEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihtZXRob2RQYXJhbWV0ZXIpOwotICAgICAgICBpZiAocGFyYW1ldGVyICE9IG51bGwgJiYgIWlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUocGFyYW1ldGVyLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYXJhbWV0ZXIsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIGxpc3RSZXdyaXRlLmluc2VydEF0KGFubm90YXRpb24sIC0xLCBudWxsKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUZXh0RWRpdCBjcmVhdGVSZW1vdmVBbm5vdGF0aW9uVGV4dEVkaXQoSUxvY2FsVmFyaWFibGUgbWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24obWV0aG9kUGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKGlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kUGFyYW1ldGVyLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKSB7Ci0gICAgICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUocGFyYW1ldGVyLmdldEFTVCgpKTsKLQotICAgICAgICAgICAgTGlzdFJld3JpdGUgbGlzdFJld3JpdGUgPSByZXdyaXRlci5nZXRMaXN0UmV3cml0ZShwYXJhbWV0ZXIsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBbm5vdGF0aW9uICYmIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoKEFubm90YXRpb24pb2JqZWN0LCBhbm5vdGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUoKEFubm90YXRpb24pb2JqZWN0LCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIGFkZGluZyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gdG8gdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGFkZCB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8uCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gYWRkLgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSBhZGQgbWVtYmVyIHZhbHVlIHBhaXIgY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFubm90YXRpb24uZ2V0QVNUKCkpOwotCi0gICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYW5ub3RhdGlvbiwgTm9ybWFsQW5ub3RhdGlvbi5WQUxVRVNfUFJPUEVSVFkpOwotCi0gICAgICAgIGxpc3RSZXdyaXRlLmluc2VydExhc3QobWVtYmVyVmFsdWVQYWlyLCBudWxsKTsKLQotICAgICAgICByZXR1cm4gcmV3cml0ZXIucmV3cml0ZUFTVCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEVkaXR9IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNoYW5nZSBvZiByZW1vdmluZyB0aGUge0BsaW5rIE1lbWJlclZhbHVlUGFpcn0gZnJvbSB0aGUge0BsaW5rIE5vcm1hbEFubm90YXRpb259LgotICAgICAqIFRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gcmVtb3ZlIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBmcm9tLgotICAgICAqIEBwYXJhbSBtZW1iZXJWYWx1ZVBhaXIgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHJlbW92ZS4KLSAgICAgKiBAcmV0dXJuIHRleHQgZWRpdCBvYmplY3QgZGVzY3JpYmluZyB0aGUgcmVtb3ZlIG1lbWJlciB2YWx1ZSBwYWlyIGNoYW5nZS4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBBIHtAbGluayBKYXZhTW9kZWxFeGNlcHRpb259IGlzIHRocm93biB3aGVuCi0gICAgICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdHMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRleHRFZGl0IGNyZWF0ZVJlbW92ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IHJld3JpdGVyLmdldExpc3RSZXdyaXRlKGFubm90YXRpb24sIE5vcm1hbEFubm90YXRpb24uVkFMVUVTX1BST1BFUlRZKTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgTGlzdCBvcmlnaW5hbExpc3QgPSBsaXN0UmV3cml0ZS5nZXRPcmlnaW5hbExpc3QoKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogb3JpZ2luYWxMaXN0KSB7Ci0gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG12cCA9IChNZW1iZXJWYWx1ZVBhaXIpIG9iamVjdDsKLSAgICAgICAgICAgICAgICBpZiAobXZwLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpKSkgewotICAgICAgICAgICAgICAgICAgICBsaXN0UmV3cml0ZS5yZW1vdmUobXZwLCBudWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJld3JpdGVyLnJld3JpdGVBU1QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRFZGl0fSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjaGFuZ2Ugb2YgdXBkYXRpbmcgdGhlIHtAbGluayBNZW1iZXJWYWx1ZVBhaXJ9IHdpdGggdGhlIHtAbGluayBBU1ROb2RlfSB2YWx1ZS4KLSAgICAgKiBUaGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0IGl0c2VsZiBpcyBub3QgbW9kaWZpZWQuCi0gICAgICogQHBhcmFtIG1lbWJlclZhbHVlUGFpciB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdXBkYXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0LgotICAgICAqIEByZXR1cm4gdGV4dCBlZGl0IG9iamVjdCBkZXNjcmliaW5nIHRoZSB1cGRhdGUgbWVtYmVyIHZhbHVlIHBhaXIgY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShtZW1iZXJWYWx1ZVBhaXIuZ2V0QVNUKCkpOwotCi0gICAgICAgIHJld3JpdGVyLnNldChtZW1iZXJWYWx1ZVBhaXIsIE1lbWJlclZhbHVlUGFpci5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0RWRpdH0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIG9mIHVwZGF0aW5nIHRoZSB7QGxpbmsgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbn0gd2l0aCB0aGUge0BsaW5rIEFTVE5vZGV9IHZhbHVlLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQgaXRzZWxmIGlzIG5vdCBtb2RpZmllZC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgc2luZ2xlIG1lbWViZXIgYW5ub3RhdGlvbiB0byB1cGRhdGUuCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQuCi0gICAgICogQHJldHVybiB0ZXh0IGVkaXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHVwZGF0ZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gY2hhbmdlLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIEEge0BsaW5rIEphdmFNb2RlbEV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoZW4KLSAgICAgKiB0aGUgdW5kZXJseWluZyBjb21waWxhdGlvbiB1bml0cyBidWZmZXIgY291bGQgbm90IGJlIGFjY2Vzc2VkLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGV4dEVkaXQgY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgQVNUTm9kZSB2YWx1ZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhbm5vdGF0aW9uLmdldEFTVCgpKTsKLQotICAgICAgICByZXdyaXRlci5zZXQoYW5ub3RhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbi5WQUxVRV9QUk9QRVJUWSwgdmFsdWUsIG51bGwpOwotCi0gICAgICAgIHJldHVybiByZXdyaXRlci5yZXdyaXRlQVNUKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSBmb3IgdGhlIGdpdmVuIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEByZXR1cm4gYSBjb21waWxhdGlvbiB1bml0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIHN3aXRjaChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKElDb21waWxhdGlvblVuaXQpIGphdmFFbGVtZW50OwotICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOgotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSAoSVBhY2thZ2VEZWNsYXJhdGlvbikgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKElDb21waWxhdGlvblVuaXQpIHBhY2thZ2VEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIGNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6Ci0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU6Ci0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gKElMb2NhbFZhcmlhYmxlKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIGlmIChsb2NhbFZhcmlhYmxlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21waWxhdGlvblVuaXRGcm9tSmF2YUVsZW1lbnQobG9jYWxWYXJpYWJsZS5nZXRQYXJlbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpIGphdmFFbGVtZW50LmdldFJlc291cmNlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgSVR5cGV9LgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlLgotICAgICAqIEByZXR1cm4gYSB0eXBlIGRlY2xhcmF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKElUeXBlIHR5cGUpIHsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVCh0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIExpc3Q8VHlwZURlY2xhcmF0aW9uPiB0eXBlcyA9IGNvbXBpbGF0aW9uVW5pdC50eXBlcygpOwotICAgICAgICBmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIDogdHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJlVHlwZU5hbWVzKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWV0aG9kRGVjbGFyYXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QKLSAgICAgKiBAcmV0dXJuIGEgbWV0aG9kIGRlY2xhcmF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kRGVjbGFyYXRpb24gZ2V0TWV0aG9kRGVjbGFyYXRpb24oSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gZ2V0VHlwZURlY2xhcmF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiA6IGJvZHlEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGJvZHlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVNZXRob2RzKG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBJRmllbGR9LgotICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQKLSAgICAgKiBAcmV0dXJuIGEgZmllbGQgZGVjbGFyYXRpb24gb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oSUZpZWxkIGZpZWxkKSB7Ci0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGdldFR5cGVEZWNsYXJhdGlvbihmaWVsZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8Qm9keURlY2xhcmF0aW9uPiBib2R5RGVjbGFyYXRpb25zID0gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiA6IGJvZHlEZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoYm9keURlY2xhcmF0aW9uIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSAoRmllbGREZWNsYXJhdGlvbikgYm9keURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZUZpZWxkTmFtZXMoZmllbGREZWNsYXJhdGlvbiwgZmllbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIElMb2NhbFZhcmlhYmxlfS4KLSAgICAgKiBAcGFyYW0gamF2YUVsZW1lbnQgdGhlIGxvY2FsIHZhcmlhYmxlCi0gICAgICogQHJldHVybiBhIHNpbmdsZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbihJTG9jYWxWYXJpYWJsZSBqYXZhRWxlbWVudCkgewotICAgICAgICBpZiAoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSAmJiBqYXZhRWxlbWVudC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGxvY2FsVmFyaWFibGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobG9jYWxWYXJpYWJsZS5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIGdldENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvckZvclR5cGUoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24KLSAgICAgICAgICAgIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBpZiAoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIGNoaWxkTGlzdFByb3BlcnR5RGVzY3JpcHRvciA9IFR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gRW51bURlY2xhcmF0aW9uLk1PRElGSUVSUzJfUFJPUEVSVFk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgY2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yID0gQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5NT0RJRklFUlMyX1BST1BFUlRZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW5ub3RhdGlvbnMgdHlwZSBuYW1lLiBJZiB0aGUgYW5ub3RhdGlvbiBuYW1lIGlzIGEgc2ltcGxlIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlCi0gICAgICogbmFtZSdzIGlkZW50aWZpZXIuIElmIHRoZSBuYW1lIGlzIGEgcXVhbGlmaWVkIG5hbWUsIHRoZSByZXN1bHQgaXMgdGhlIG5hbWUgb2YgdGhlIHF1YWxpZmllcgotICAgICAqIGZvbGxvd2VkIGJ5ICIuIiBmb2xsb3dlZCBieSB0aGUgbmFtZSdzIGlkZW50aWZpZXIuCi0KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG5hbWUuIFRoZSBzaW1wbGUgbmFtZSBvciB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIE5hbWUgYW5ub3RhdGlvblR5cGVOYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpOwotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblR5cGVOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB7QGxpbmsgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb259IGFuZCB7QGxpbmsgSVR5cGV9LgotICAgICAqIEBwYXJhbSBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZS4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lcyBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZVR5cGVOYW1lcyhBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiwgSVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHModHlwZS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBhbmQge0BsaW5rIElNZXRob2R9LgotICAgICAqIEBwYXJhbSBtZXRob2REZWNsYXJhdGlvbiB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtZXRldFR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9uUGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXRUeXBlcy5sZW5ndGggPT0gbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGV0VHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUxID0gU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRldFR5cGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpbXBsZU5hbWUyID0gbWV0aG9kRGVjbGFyYXRpb25QYXJhbWV0ZXJzLmdldChpKS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB0d28ge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kT25lIHRoZSBmaXJzdCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIG1ldGhvZFR3byB0aGUgc2Vjb25kIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2RUd28pIHsKLSAgICAgICAgaWYgKG1ldGhvZE9uZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2RUd28uZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSkpIHsKLSAgICAgICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gbWV0aG9kUGFyYW1ldGVyc09uZSA9IG1ldGhvZE9uZS5wYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IG1ldGhvZFBhcmFtZXRlcnNUd28gPSBtZXRob2RUd28ucGFyYW1ldGVycygpOwotICAgICAgICAgICAgaWYgKG1ldGhvZFBhcmFtZXRlcnNPbmUuc2l6ZSgpID09IG1ldGhvZFBhcmFtZXRlcnNUd28uc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RQYXJhbWV0ZXJzT25lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaW1wbGVOYW1lMSA9IG1ldGhvZFBhcmFtZXRlcnNPbmUuZ2V0KGkpLmdldFR5cGUoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZTIgPSBtZXRob2RQYXJhbWV0ZXJzVHdvLmdldChpKS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW1wbGVOYW1lMS5lcXVhbHMoc2ltcGxlTmFtZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHRoZSB0d28ge0BsaW5rIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kT25lIHRoZSBmaXJzdCBtZXRob2QgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIG1ldGhvZFR3byB0aGUgc2Vjb25kIG1ldGhvZCBkZWNsYXJhdGlvbi4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbmFtZXMgYW5kIHBhcmFtZXRlciB0eXBlcyBtYXRjaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZU1ldGhvZHMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIHJldHVybiBjb21wYXJlTWV0aG9kTmFtZXMobWV0aG9kT25lLCBtZXRob2RUd28pICYmIGNvbXBhcmVNZXRob2RQYXJhbWV0ZXJUeXBlcyhtZXRob2RPbmUsIG1ldGhvZFR3byk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWV0aG9kTmFtZXMoY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kT25lLAotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kVHdvKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RPbmUuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhtZXRob2RUd28uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVNZXRob2RQYXJhbWV0ZXJUeXBlcyhjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiBtZXRob2RPbmUsCi0gICAgICAgICAgICBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbiBtZXRob2RUd28pIHsKLSAgICAgICAgaW50IG51bWJlck9mUGFyYW1ldGVyc09uZSA9IG1ldGhvZE9uZS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpOwotICAgICAgICBpbnQgbnVtYmVyT2ZQYXJhbWV0ZXJzVHdvID0gbWV0aG9kVHdvLmdldFBhcmFtZXRlcnMoKS5zaXplKCk7Ci0KLSAgICAgICAgaWYgKG51bWJlck9mUGFyYW1ldGVyc09uZSA9PSBudW1iZXJPZlBhcmFtZXRlcnNUd28pIHsKLSAgICAgICAgICAgIExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnNPbmUgPSAoTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4pIG1ldGhvZE9uZS5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzVHdvID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2RUd28uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzT25lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJzT25lLmdldChpKS5nZXRUeXBlKCkuZXF1YWxzKHBhcmFtZXRlcnNUd28uZ2V0KGkpLmdldFR5cGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0aGUge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGFuZCB7QGxpbmsgSUZpZWxkfS4KLSAgICAgKiBAcGFyYW0gZmllbGREZWNsYXJhdGlvbiB0aGUgZmllbGQgZGVjbGFyYXRpb24uCi0gICAgICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWVsZCBuYW1lcyBtYXRjaC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUZpZWxkTmFtZXMoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBJRmllbGQgZmllbGQpIHsKLSAgICAgICAgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyA9IGZpZWxkRGVjbGFyYXRpb24uZnJhZ21lbnRzKCk7Ci0gICAgICAgIGZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA6IGZyYWdtZW50cykgewotICAgICAgICAgICAgaWYgKHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhmaWVsZC5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVBbm5vdGF0aW9uTmFtZXMoQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uLCBBbm5vdGF0aW9uIGV4aXN0aW5nQW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGV4aXN0aW5nQW5ub3RhdGlvbikuZXF1YWxzKAotICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShuZXdBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB7QGxpbmsgQW5ub3RhdGlvbn0gaXMgcHJlc2VudCBvbiB0aGUge0BsaW5rIElKYXZhRWxlbWVudH0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBhbm5vdGF0aW9uLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoamF2YUVsZW1lbnQsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgcHJlc2VudCBvbiB0aGUge0BsaW5rIElKYXZhRWxlbWVudH0uCi0gICAgICogQHBhcmFtIGphdmFFbGVtZW50IG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIGphdmEgZWxlbWVudDoKLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT048L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuVFlQRTwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5GSUVMRDwvbGk+Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5NRVRIT0Q8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEU8L2xpPgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZSB0aGUgYW5ub3RhdGlvbiBuYW1lLgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQW5ub3RhdGlvblByZXNlbnQoKChJQ29tcGlsYXRpb25Vbml0KWphdmFFbGVtZW50KS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbk5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGVsZW1lbnRUeXBlID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQotICAgICAgICBpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04KLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRQotICAgICAgICAgICAgICAgIHx8IGVsZW1lbnRUeXBlID09IElKYXZhRWxlbWVudC5NRVRIT0QKLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUKLSAgICAgICAgICAgICAgICB8fCBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLQotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIHtAbGluayBBbm5vdGF0aW9ufSB0aGF0IGFyZSBwcmVzZW50IG9uIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFFbGVtZW50fQotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBhbm5vdGF0aW9ucy4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLSAgICAgICAgICAgIFBhY2thZ2VEZWNsYXJhdGlvbiBwYWNrYWdlRGVjbGFyYXRpb24gPSBjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZSgpOwotICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VEZWNsYXJhdGlvbi5hbm5vdGF0aW9ucygpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGUpOwotICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyh0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QpOwotICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKG1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCk7Ci0gICAgICAgICAgICBpZiAoZmllbGREZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhmaWVsZERlY2xhcmF0aW9uLm1vZGlmaWVycygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigoSUxvY2FsVmFyaWFibGUpIGphdmFFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdEFubm90YXRpb25zKHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QW5ub3RhdGlvbj4gZXh0cmFjdEFubm90YXRpb25zKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGV4dGVuZGVkTW9kaWZpZXJzKSB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb24+KCk7Ci0gICAgICAgIGZvciAoSUV4dGVuZGVkTW9kaWZpZXIgZXh0ZW5kZWRNb2RpZmllciA6IGV4dGVuZGVkTW9kaWZpZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZXh0ZW5kZWRNb2RpZmllci5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmFkZCgoQW5ub3RhdGlvbikgZXh0ZW5kZWRNb2RpZmllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIElNZXRob2R9LgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZC4KLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzaW5nbGUgdmFyaWFibGUgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBnZXRTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ucyhmaW5hbCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgZmluYWwgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPigpOwotICAgICAgICBjb21waWxhdGlvblVuaXQuYWNjZXB0KG5ldyBBU1RWaXNpdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlTWV0aG9kcyhtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZEFsbChtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSUxvY2FsVmFyaWFibGV9IGF0IHRoZSBnaXZlbiBvZmZzZXQgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSBmaWxlLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCBpbiB3aGljaCB0aGUgbG9jYWwgdmFyaWFibGUgaXMgZGVjbGFyZWQuCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgc291cmNlIGZpbGUuCi0gICAgICogVGhlIG9mZnNldCBtdXN0IGJlID49IHRvIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZAotICAgICAqIDw9IHRoZSBub2RlcyBzdGFydCBwb3NpdGlvbiBwbHVzIGxlbmd0aC4KLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbCB2YXJpYWJsZSBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElMb2NhbFZhcmlhYmxlIGdldExvY2FsVmFyaWFibGUoSU1ldGhvZCBtZXRob2QsIGludCBvZmZzZXQpIHsKLSAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGludCBwYXJhbWV0ZXJTdGFydFBvc2l0aW9uID0gcGFyYW1ldGVyLmdldFN0YXJ0UG9zaXRpb24oKTsKLSAgICAgICAgICAgIGludCBwYXJhbWV0ZXJMZW5ndGggPSBwYXJhbWV0ZXIuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHBhcmFtZXRlclN0YXJ0UG9zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDw9IHBhcmFtZXRlclN0YXJ0UG9zaXRpb24gKyBwYXJhbWV0ZXJMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJTG9jYWxWYXJpYWJsZX0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmVkIHtAbGluayBJTWV0aG9kfS4KLSAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgaW4gd2hpY2ggdGhlIGxvY2FsIHZhcmlhYmxlIGlzIGRlY2xhcmVkLgotICAgICAqIEBwYXJhbSBwYXJhbU5hbWUgdGhlIGxvY2FsIHZhcmlhYmxlIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbG9jYWwgdmFyaWFibGUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJTG9jYWxWYXJpYWJsZSBnZXRMb2NhbFZhcmlhYmxlKElNZXRob2QgbWV0aG9kLCBTdHJpbmcgcGFyYW1OYW1lKSB7Ci0gICAgICAgIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IGdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0gICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEFTVCB7QGxpbmsgQW5ub3RhdGlvbn0gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzCi0gICAgICogb24gdGhlIHtAbGluayBJSmF2YUVsZW1lbnR9LgotICAgICAqIEBwYXJhbSBqYXZhRWxlbWVudCBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBqYXZhIGVsZW1lbnQ6Ci0gICAgICogPGxpPklKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LlRZUEU8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuRklFTEQ8L2xpPgotICAgICAqIDxsaT5JSmF2YUVsZW1lbnQuTUVUSE9EPC9saT4KLSAgICAgKiA8bGk+SUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFPC9saT4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUge0BsaW5rIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb259IGNsYXNzLgotICAgICAqIEByZXR1cm4gdGhlIEFTVCBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb24pIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25zKGphdmFFbGVtZW50KTsKLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFzdEFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXN0QW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgaWYgKHR5cGVOYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZU5hbWUuZXF1YWxzKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhc3RBbm5vdGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbm5vdGF0aW9uTWlycm9yfSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MKLSAgICAgKiBvbiB0aGUge0BsaW5rIERlY2xhcmF0aW9ufS4KLSAgICAgKiBAcGFyYW0gZGVjbGFyYXRpb24gdGhlIGRlY2xhcmF0aW9uCi0gICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG1pcnJvciBvciBudWxsIGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFubm90YXRpb25NaXJyb3IgZ2V0QW5ub3RhdGlvbihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYWFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLQotICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA6IGFhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uID0gYW5ub3RhdGlvbk1pcnJvcgotICAgICAgICAgICAgLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGFubm90YXRpb24uZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIEpEVCB7QGxpbmsgSUFubm90YXRpb259IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHtAbGluayBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9ufSBjbGFzcwotICAgICAqIG9uIHRoZSB7QGxpbmsgSUFubm90YXRhYmxlfSBlbGVtZW50LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gY2xhc3MuCi0gICAgICogQHBhcmFtIGFubm90YXRhYmxlIGEgcGFja2FnZSBkZWNsYXJhdGlvbiwgYSB0eXBlLCBhIG1ldGhvZCwgYSBmaWVsZCBvciBhIGxvY2FsIHZhcmlhYmxlIGluIGEgY29tcGlsYXRpb24gdW5pdC4KLSAgICAgKiBAcmV0dXJuIHRoZSBhbm5vdGF0aW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIGlmIHRoZSBhbm5vdGF0YWJsZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiwKLSAgICAgICAgICAgIElBbm5vdGF0YWJsZSBhbm5vdGF0YWJsZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBhbm5vdGF0YWJsZS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gamR0QW5ub3RhdGlvbi5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhhbm5vdGF0aW9uLmdldENhbm9uaWNhbE5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFubm90YXRpb24uZ2V0U2ltcGxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBqZHRBbm5vdGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBBbm5vdGF0aW9uVmFsdWV9IHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIHRoYXQgaXMgZGVjbGFyZWQgd2l0aGluIHRoZSB7QGxpbmsgQW5ub3RhdGlvbk1pcnJvcn0uCi0gICAgICogQHBhcmFtIG1pcnJvciB0aGUgYW5ub3RhdGlvbiBtaXJyb3IuCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gdmFsdWUgb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uVmFsdWUgZ2V0QW5ub3RhdGlvblZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBNYXA8QW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZT4gdmFsdWVzID0gbWlycm9yLmdldEVsZW1lbnRWYWx1ZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeTxBbm5vdGF0aW9uVHlwZUVsZW1lbnREZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlPj4gZW50cnlTZXQgPSB2YWx1ZXMuZW50cnlTZXQoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8QW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZT4gZW50cnkgOiBlbnRyeVNldCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHtAbGluayBOb3JtYWxBbm5vdGF0aW9ufSBtZW1iZXIgdmFsdWUgcGFpciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gbm9ybWFsQW5ub3RhdGlvbiB0aGUgbm9ybWFsIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGV4cHJlc3Npb24gb3IgbnVsbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBFeHByZXNzaW9uIGdldEFubm90YXRpb25WYWx1ZShOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKRFQge0BsaW5rIElBbm5vdGF0aW9ufSBtZW1iZXIgdmFsdWUgcGFpciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtZW1iZXIgdmFsdWUgcGFpcnMgdmFsdWUuCi0gICAgICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgaXRzIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvblZhbHVlKElBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWVtYmVyVmFsdWVQYWlyfSB3aXRoIHRoZSBnaXZlbiBtZW1iZXIgbmFtZSBmcm9tIHRoZSB7QGxpbmsgTm9ybWFsQW5ub3RhdGlvbn0uCi0gICAgICogQHBhcmFtIG5vcm1hbEFubm90YXRpb24gdGhlIG5vcm1hbCBhbm5vdGF0aW9uLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZSBvZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgdG8gcmV0dXJuLgotICAgICAqIEByZXR1cm4gYSBtZW1iZXIgdmFsdWUgcGFpciBvciBudWxsIGlmIG5vIG1lbWJlciB2YWx1ZSBwYWlyIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgc3RhdGljIE1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVzUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZXNQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9uTWlycm9yfSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBtaXJyb3IgdGhlIGFubm90YXRpb24gbWlycm9yLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBTdHJpbmcgb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZ1ZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgYW5ub3RhdGlvblZhbHVlID0gZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25WYWx1ZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBBU1QgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0QW5ub3RhdGlvblZhbHVlKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBtZW1iZXJOYW1lKTsKLSAgICAgICAgICAgIGlmIChleHByZXNzaW9uICE9IG51bGwgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRMaXRlcmFsVmFsdWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBTdHJpbmd9IHZhbHVlLgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBKRFQgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgKiBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIEFubm90YXRpb25NaXJyb3J9IGFzIGEge0BsaW5rIEJvb2xlYW59IHZhbHVlLgotICAgICAqIEBwYXJhbSBtaXJyb3IgdGhlIGFubm90YXRpb24gbWlycm9yLgotICAgICAqIEBwYXJhbSBtZW1iZXJOYW1lIHRoZSBtZW1iZXIgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZW1iZXIgdmFsdWUgYXMgYSBCb29sZWFuIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKEFubm90YXRpb25NaXJyb3IgbWlycm9yLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmdWYWx1ZShtaXJyb3IsIG1lbWJlck5hbWUpOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBCb29sZWFufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgQVNUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGdldEFubm90YXRpb25WYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBCb29sZWFuTGl0ZXJhbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoKChCb29sZWFuTGl0ZXJhbCkgZXhwcmVzc2lvbikuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBhcyBhIHtAbGluayBCb29sZWFufSB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgSkRUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIEJvb2xlYW4gb3IgbnVsbCBpZiBubyBtZW1iZXIgd2l0aCB0aGUgbWVtYmVyIG5hbWUgY2FuIGJlIGZvdW5kLgotICAgICAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uICBpZiB0aGUgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdCBvciBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZwotICAgICAqIGl0cyBjb3JyZXNwb25kaW5nIHJlc291cmNlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZW1iZXIgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gbWVtYmVyIG5hbWUgZnJvbSB0aGUge0BsaW5rIEFubm90YXRpb259IGFzIGEge0BsaW5rIFN0cmluZ30gdmFsdWUuCi0gICAgICogVGhlIHJldHVybmVkIFN0cmluZyB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLSAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aGUgQVNUIGFubm90YXRpb24uCi0gICAgICogQHBhcmFtIG1lbWJlck5hbWUgdGhlIG1lbWJlciBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIG1lbWJlciB2YWx1ZSBhcyBhIFN0cmluZyBvciBudWxsIGlmIG5vIG1lbWJlciB3aXRoIHRoZSBtZW1iZXIgbmFtZSBjYW4gYmUgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW51bVZhbHVlKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBnZXRBbm5vdGF0aW9uVmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIG1lbWJlck5hbWUpOwotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uIGluc3RhbmNlb2YgUXVhbGlmaWVkTmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAoKFF1YWxpZmllZE5hbWUpIGV4cHJlc3Npb24pLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWVtYmVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIG1lbWJlciBuYW1lIGZyb20gdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gYXMgYSB7QGxpbmsgU3RyaW5nfSB2YWx1ZS4KLSAgICAgKiBUaGUgcmV0dXJuZWQgU3RyaW5nIHZhbHVlIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnVtIGNvbnN0YW50LgotICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBKRFQgYW5ub3RhdGlvbi4KLSAgICAgKiBAcGFyYW0gbWVtYmVyTmFtZSB0aGUgbWVtYmVyIG5hbWUuCi0gICAgICogQHJldHVybiB0aGUgbWVtYmVyIHZhbHVlIGFzIGEgU3RyaW5nIG9yIG51bGwgaWYgbm8gbWVtYmVyIHdpdGggdGhlIG1lbWJlciBuYW1lIGNhbiBiZSBmb3VuZC4KLSAgICAgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAgaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Qgb3IgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcKLSAgICAgKiBpdHMgY29ycmVzcG9uZGluZyByZXNvdXJjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtVmFsdWUoSUFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG1lbWJlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgbWVtYmVyTmFtZSk7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmluZGV4T2YoIi4iKSAhPSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL3Byb2Nlc3Nvci9Bbm5vdGF0aW9uc0NvcmVQcm9jZXNzb3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjM2NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvcHJvY2Vzc29yL0Fubm90YXRpb25zQ29yZVByb2Nlc3NvckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmFwdC5Bbm5vdGF0aW9uUHJvY2Vzc29yczsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNDb3JlUHJvY2Vzc29yRmFjdG9yeSBpbXBsZW1lbnRzIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5IHsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yIGdldFByb2Nlc3NvckZvcihTZXQ8QW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbj4gYW5ub3RhdGlvblNldCwKLSAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBwcm9jZXNzb3JFbnZpcm9ubWVudCkgewotCi0gICAgCWlmIChhbm5vdGF0aW9uU2V0LnNpemUoKSA9PSAwKSB7Ci0gICAgCQlyZXR1cm4gQW5ub3RhdGlvblByb2Nlc3NvcnMuTk9fT1A7Ci0gICAgCX0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uUHJvY2Vzc29yPiBhbm5vdGF0aW9uUHJvY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvblByb2Nlc3Nvcj4oKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4+IGFubm90YXRpb25Qcm9jZXNzb3JDYWNoZSA9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvblByb2Nlc3NvcnNDYWNoZSgpOwotCi0gICAgICAgIGZvciAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIDogYW5ub3RhdGlvblNldCkgewotICAgICAgICAgICAgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHByb2Nlc3NvckVsZW1lbnRzID0gYW5ub3RhdGlvblByb2Nlc3NvckNhY2hlLmdldCgKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotCi0gICAgICAgICAgICBmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHByb2Nlc3NvckVsZW1lbnRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBnZXRBbm5vdGF0aW9uUHJvY2Vzc29yKGNvbmZpZ3VyYXRpb25FbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uUHJvY2Vzc29ycy5nZXRDb21wb3NpdGVBbm5vdGF0aW9uUHJvY2Vzc29yKGFubm90YXRpb25Qcm9jZXNzb3JzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25Qcm9jZXNzb3IgZ2V0QW5ub3RhdGlvblByb2Nlc3NvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQsCi0gICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgcHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgYW5ub3RhdGlvblByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICAoQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yKWNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0gICAgICAgICAgICAgIGFubm90YXRpb25Qcm9jZXNzb3Iuc2V0QW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KHByb2Nlc3NvckVudmlyb25tZW50KTsKLSAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Qcm9jZXNzb3I7Ci0gICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZEFubm90YXRpb25UeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uUHJvY2Vzc29yc0NhY2hlKCkua2V5U2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTliNjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5NGY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgTm92IDA3IDIzOjU4OjUyIEVTVCAyMDA4Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDY0NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLkNYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3M7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfYnVqYXZhLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjY0YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIFNoYW5lIENsYXJrZSAtIEFwYWNoZSBDWEYgc3VwcG9ydAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIS0tIFNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAiY2xpZW50IiBzY2VuYXJpby4KLVNjZW5hcmlvVHlwZT1zZXJ2aWNlCi0KLSEtLSBJbml0aWFsU2VsZWN0aW9uIFJFUVVJUkVELiAgV29ya3NwYWNlIHJlbGF0aXZlIFVSSSB0byB0aGUgaW5wdXQgV1NETCBvciBKYXZhCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvc3JjL3BhY2thZ2VuYW1lL215U2VydmljZS5qYXZhCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsaWQgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gU2VydmljZS5SdW50aW1lSWQsIFNlcnZpY2UuU2VydmVySWQgCi1MaXN0UnVudGltZXM9dHJ1ZQotTGlzdFNlcnZlcnM9dHJ1ZQotIS0tIFZlcmJvc2Ugd2lsbCBsaXN0IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgYXMgd2VsbCBhcyBlcnJvcnMgaWYgc2V0IHRvIHRydWUKLVZlcmJvc2U9dHJ1ZQotCi0hLS0gIFNlcnZpY2UuUnVudGltZUlkIC0gSUQgb2Ygd2ViIHNlcnZpY2UgcnVudGltZSAKLVNlcnZpY2UuUnVudGltZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3hmV2ViU2VydmljZVJUCi0hLS0gU2VydmljZS5TZXJ2ZXJJZCAtICBJRCBvZiB0YXJnZXQgc2VydmVyIAotU2VydmljZS5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotIS0tIFNlcnZpY2UuVHlwZUlkIC0gSmF2YSBCZWFuIGlzIGRlZmF1bHQgZm9yIGJvdGggVG9wIERvd24gYW5kIEJvdHRvbSBVcAotIS0tIFNlcnZpY2UuVHlwZUlkPUphdmEgQmVhbgotCi0hLS0gU2VydmljZVByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBwcm9qZWN0IGEgZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbi4gIHR5cGU6IFN0cmluZyAgICAKLSEtLVNlcnZpY2VQcm9qZWN0TmFtZT1zZXJ2aWNlUHJvamVjdE5hbWUKLSEtLSBTZXJ2aWNlRWFyUHJvamVjdE5hbWUgLSAhLS10eXBlOlN0cmluZyAtIG5hbWUgb2YgU2VydmljZSBFQVIgcHJvamVjdCAtIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZ2l2ZSB0aGUgc2VydmljZSBFQVIgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIEVBUiBwcm9qZWN0IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlIHByb2plY3QuICB0eXBlOiBTdHJpbmcKLSEtLVNlcnZpY2VFYXJQcm9qZWN0TmFtZT1zZXJ2aWNlRWFyUHJvamVjdE5hbWUKLQotIS0tIEdlbmVyYXRlIGEgY2xpZW50IG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzCi0hLS1HZW5DbGllbnQ9ZmFsc2UKLSEtLSBHZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS0gU3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnMKLSEtLUdlbldyYXBwZXJGYXVsdEJlYW5zPXRydWUKLSEtLSBTcGVjaWZ5IHRvIGdlbmVyYXRlIHRoZSBXU0RMIGZpbGUKLSEtLUdlbldTREw9dHJ1ZQotIS0tIE91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0byBsb2FkIHRoZW0gaW5zdGVhZCBvZiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwKLSEtLUdlblhTREltcG9ydHM9dHJ1ZQotIS0tU3BlY2lmaWVzIHRoYXQgdGhlIGdlbmVyYXRlZCBXU0RMIGlzIHRvIGluY2x1ZGUgYSBTT0FQIDEuMiBiaW5kaW5nCi0hLS1Vc2VTT0FQMTJCaW5kaW5nPWZhbHNlCi0hLS1TZXQgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBXU0RMIGZpbGUKLSEtLVdzZGxGaWxlTmFtZT1teVdTRExGaWxlTmFtZS53c2RsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2J1amF2YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWY4YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9idWphdmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2J1amF2YS5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2J1amF2YSIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDI5MmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfY2xpZW50LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLVNjZW5hcmlvVHlwZSBSRVFVSVJFRC4gRGlmZmVyZW50aWF0ZXMgZnJvbSAic2VydmljZSIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9Y2xpZW50Ci0KLSEtLUluaXRpYWxTZWxlY3Rpb24gUkVRVUlSRUQuICBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHRoZSBpbnB1dCBXU0RMIG9yIEphdmEuCi1Jbml0aWFsU2VsZWN0aW9uPS9keW5hbWljV2ViUHJvamVjdE5hbWUvV2ViQ29udGVudC93c2RsL215U2VydmljZS53c2RsCi0KLSEtLVV0aWxpdHkgcHJvcGVydHkgdmFsdWVzIC0gdXNlIHRoZXNlIHRvIGxpc3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0hLS0gQ2xpZW50LlJ1bnRpbWVJZCwgQ2xpZW50LlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLSAKLSEtLUNsaWVudC5SdW50aW1lSWQgLSBJRCBvZiB3ZWIgc2VydmljZSBydW50aW1lIAotQ2xpZW50LlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tQ2xpZW50LlNlcnZlcklkIC0gSUQgb2YgdGFyZ2V0IHNlcnZlciAKLUNsaWVudC5TZXJ2ZXJJZD1vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC42MAotCi0hLS1DbGllbnRQcm9qZWN0TmFtZSAtIG5hbWUgb2YgQ2xpZW50IHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIGNsaWVudCBwcm9qZWN0IGEgCi0hLS0gZGlmZmVyZW50IG5hbWUgdGhhbiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBpbml0aWFsIHNlbGVjdGlvbgotIS0tQ2xpZW50UHJvamVjdE5hbWU9Y2xpZW50UHJvamVjdE5hbWUKLQotIS0tQ2xpZW50RWFyUHJvamVjdE5hbWUtIG5hbWUgb2YgQ2xpZW50IEVBUiBwcm9qZWN0IC0gc2V0IG9ubHkgaWYgYXBwbGljYWJsZSBmb3Igc2VsZWN0ZWQgc2VydmVyIHR5cGUKLSEtLUNsaWVudEVhclByb2plY3ROYW1lPWNsaWVudEVBUlByb2plY3ROYW1lCi0KLSEtLUNsaWVudENvbXBvbmVudFR5cGUgLSB0eXBlIG9mIENsaWVudCBwcm9qZWN0Ci0hLS1DbGllbnRDb21wb25lbnRUeXBlPXRlbXBsYXRlLmN4Zi5jb3JlCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLUdlbmVyYXRlIENsaWVudCA6IFJFUVVJUkVECi1HZW5DbGllbnQ9dHJ1ZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotIS0tU2VydmljZU5hbWU9bXlTZXJ2aWNlCi0KLSEtLVhKQyBBcmdzOiBTcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLQotIS0tSW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotIS0teGpjX2R2PWZhbHNlCi0hLS1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLSEtLXhqY190cz1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIG11bHRpIGxpbmUgb3V0cHV0Ci0hLS14amNfdHNfbXVsdGk9ZmFsc2UKLSEtLUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBzaW5nbGUgbGluZSB0ZXJzZSBvdXRwdXQKLSEtLXhqY190c19zaW1wbGU9ZmFsc2UKLSEtLUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLSEtLXhqY19sb2NhdG9yPWZhbHNlCi0hLS1HZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIHdpdGggdGhlICdzeW5jaHJvbml6ZWQnIGtleXdvcmQKLSEtLXhqY19zeW5jX21ldGhvZHM9ZmFsc2UKLSEtLUFkZCBAR2VuZXJhdGVkIGFubm90YXRpb25zIHRvIHRoZSBnZW5lcmF0ZWQgY29kZQotIS0teGpjX21hcmtfZ2VuZXJhdGVkPWZhbHNlCi0KLSEtLSBNYXBwaW5ncwotIS0tIFRvcCBkb3duIHNjZW5hcmlvLiBXb3Jrc3BhY2UgcmVsYXRpdmUgVVJJIHRvIHByb3BlcnR5IGZpbGUgY29udGFpbmluZyBtYXBwaW5ncy4KLSEtLSBNYXBwaW5ncyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBwYWNrYWdlIG5hbWVzIG9mIHRoZSBnZW5lcmF0ZWQgSmF2YSB0ZW1wbGF0ZSBjbGFzc2VzLgotIS0tIFRoZSBjb250ZW50IG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbXVzdCBiZSBvZiB0aGUgZm9ybWF0IG5hbWVzcGFjZT1wYWNrYWdlICAKLSEtLU1hcHBpbmdzPS9keW5hbWljV2ViUHJvamVjdE5hbWUvbWFwcGluZ3MudHh0Ci0KLSEtLUJpbmRpbmcgRmlsZXMuIENvbW1hIGRlbGltaXRlZCBzdHJpbmcgb2YgYWJzb2x1dGUgcGF0aHMgaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcy4KLSEtLUJpbmRpbmdzPUM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcxLnhtbCxDOi93b3Jrc3BhY2UxL2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9iaW5kaW5nMi54bWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX2NsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2E1NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYW50L2N4Zl9jbGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCi08ZWNobyBtZXNzYWdlPSJwdWxsaW5nIGluIHByb3BlcnR5IGZpbGVzIi8+Ci08cHJvcGVydHkgZmlsZT0iY3hmX2NsaWVudC5wcm9wZXJ0aWVzIi8+Ci0JCi08ZWNobyBtZXNzYWdlPSJjYWxsaW5nIHRoZSB3ZWIgc2VydmljZXMgZ2VuZXJhdGlvbiBhbnQgdGFzazogY3hmX2NsaWVudCIvPgotIDx0YXJnZXQgbmFtZT0ibWFpbiIgPgotICAJIDx3c2dlbi8+Ci0gIDwvdGFyZ2V0PgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZlODg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBTaGFuZSBDbGFya2UgLSBBcGFjaGUgQ1hGIHN1cHBvcnQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBTY2VuYXJpb1R5cGUgUkVRVUlSRUQuIERpZmZlcmVudGlhdGVzIGZyb20gImNsaWVudCIgc2NlbmFyaW8uCi1TY2VuYXJpb1R5cGU9c2VydmljZQotCi0hLS0gSW5pdGlhbFNlbGVjdGlvbiBSRVFVSVJFRC4gIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gdGhlIGlucHV0IFdTREwgb3IgSmF2YQotSW5pdGlhbFNlbGVjdGlvbj0vZHluYW1pY1dlYlByb2plY3ROYW1lL1dlYkNvbnRlbnQvd3NkbC9teVNlcnZpY2Uud3NkbAotCi0hLS1VdGlsaXR5IHByb3BlcnR5IHZhbHVlcyAtIHVzZSB0aGVzZSB0byBsaXN0IHZhbGlkIHZhbHVlcyBmb3IgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIS0tIFNlcnZpY2UuUnVudGltZUlkLCBTZXJ2aWNlLlNlcnZlcklkIAotTGlzdFJ1bnRpbWVzPXRydWUKLUxpc3RTZXJ2ZXJzPXRydWUKLSEtLSBWZXJib3NlIHdpbGwgbGlzdCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIGFzIHdlbGwgYXMgZXJyb3JzIGlmIHNldCB0byB0cnVlCi1WZXJib3NlPXRydWUKLQotIS0tICBTZXJ2aWNlLlJ1bnRpbWVJZCAtIElEIG9mIHdlYiBzZXJ2aWNlIHJ1bnRpbWUgCi1TZXJ2aWNlLlJ1bnRpbWVJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVAotIS0tIFNlcnZpY2UuU2VydmVySWQgLSAgSUQgb2YgdGFyZ2V0IHNlcnZlciAKLVNlcnZpY2UuU2VydmVySWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNjAKLSEtLSBTZXJ2aWNlLlR5cGVJZCAtIEphdmEgQmVhbiBpcyBkZWZhdWx0IGZvciBib3RoIFRvcCBEb3duIGFuZCBCb3R0b20gVXAKLSEtLSBTZXJ2aWNlLlR5cGVJZD1KYXZhIEJlYW4KLQotIS0tIFNlcnZpY2VQcm9qZWN0TmFtZSAtICEtLXR5cGU6U3RyaW5nIC0gbmFtZSBvZiBTZXJ2aWNlIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgcHJvamVjdCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgaW5pdGlhbCBzZWxlY3Rpb24uICB0eXBlOiBTdHJpbmcgICAgCi0hLS1TZXJ2aWNlUHJvamVjdE5hbWU9c2VydmljZVByb2plY3ROYW1lCi0hLS0gU2VydmljZUVhclByb2plY3ROYW1lIC0gIS0tdHlwZTpTdHJpbmcgLSBuYW1lIG9mIFNlcnZpY2UgRUFSIHByb2plY3QgLSB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhlIHNlcnZpY2UgRUFSIHByb2plY3QgYSBkaWZmZXJlbnQgbmFtZSB0aGFuIHRoZSBFQVIgcHJvamVjdCBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBwcm9qZWN0LiAgdHlwZTogU3RyaW5nCi0hLS1TZXJ2aWNlRWFyUHJvamVjdE5hbWU9c2VydmljZUVhclByb2plY3ROYW1lCi0KLSEtLSBKYXZhT3V0cHV0Ci0hLS0gVG9wIGRvd24gLSBTdHJpbmc6IHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgVVJJIGZvciBhIEphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUgLSBtdXN0IGJlIGV4aXN0aW5nIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyCi0hLS1KYXZhT3V0cHV0PS9wcm9qZWN0TmFtZS9KYXZhU291cmNlCi0KLSEtLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIFdTREwgc2VydmljZSBmb3Igd2hpY2ggY29kZSBpcyB0byBiZSBnZW5lcmF0ZWQuIFRoZSBkZWZhdWx0IGlzIHRvIGdlbmVyYXRlIGNvZGUgZm9yIGV2ZXJ5IHNlcnZpY2UgaW4gdGhlIFdTREwgZG9jdW1lbnQKLSEtLVNlcnZpY2VOYW1lPW15U2VydmljZQotCi0hLS1HZW5lcmF0ZSBhIHNlcnZlciBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJcwotIS0tR2VuU2VydmVyPWZhbHNlCi0hLS1HZW5lcmF0ZSBzdGFydGluZyBwb2ludCBjb2RlIGZvciBhbiBpbXBsZW1lbnRhdGlvbiBvYmplY3QKLSEtLUdlbkltcGw9dHJ1ZQotIS0tR2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLSEtLURlZmF1bHRWYWx1ZXM9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBwcm9jZXNzaW5nIG9mIGV4dGVuZGVkIHNvYXAgaGVhZGVyIG1lc3NhZ2UgYmluZGluZwotIS0tRXh0U09BUEhlYWRlcnM9ZmFsc2UKLSEtLUVuYWJsZXMgb3IgZGlzYWJsZXMgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLSEtLURlZmF1bHROYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nCi0hLS1EZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2U9dHJ1ZQotIS0tRW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uCi0hLS1BdXRvTmFtZVJlc29sdXRpb249ZmFsc2UKLQotIS0tWEpDIEFyZ3M6IFNwZWNpZnkgdGhlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFhKQwotCi0hLS1Jbml0aWFsaXNlIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzCi0hLS14amNfZHY9ZmFsc2UKLSEtLUFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlcwotIS0teGpjX3RzPWZhbHNlCi0hLS1IYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQKLSEtLXhqY190c19tdWx0aT1mYWxzZQotIS0tSGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotIS0teGpjX3RzX3NpbXBsZT1mYWxzZQotIS0tRW5hYmxlIHNvdXJjZSBsb2NhdGlvbiBzdXBwb3J0IGZvciBnZW5lcmF0ZWQgY29kZQotIS0teGpjX2xvY2F0b3I9ZmFsc2UKLSEtLUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotIS0teGpjX3N5bmNfbWV0aG9kcz1mYWxzZQotIS0tQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgdG8gdGhlIGdlbmVyYXRlZCBjb2RlCi0hLS14amNfbWFya19nZW5lcmF0ZWQ9ZmFsc2UKLQotIS0tIE1hcHBpbmdzCi0hLS0gVG9wIGRvd24gc2NlbmFyaW8uIFdvcmtzcGFjZSByZWxhdGl2ZSBVUkkgdG8gcHJvcGVydHkgZmlsZSBjb250YWluaW5nIG1hcHBpbmdzLgotIS0tIE1hcHBpbmdzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZXMgb2YgdGhlIGdlbmVyYXRlZCBKYXZhIHRlbXBsYXRlIGNsYXNzZXMuCi0hLS0gVGhlIGNvbnRlbnQgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBtdXN0IGJlIG9mIHRoZSBmb3JtYXQgbmFtZXNwYWNlPXBhY2thZ2UgIAotIS0tTWFwcGluZ3M9L2R5bmFtaWNXZWJQcm9qZWN0TmFtZS9tYXBwaW5ncy50eHQKLQotIS0tQmluZGluZyBGaWxlcy4gQ29tbWEgZGVsaW1pdGVkIHN0cmluZyBvZiBhYnNvbHV0ZSBwYXRocyBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gb2YgSkFYV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLgotIS0tQmluZGluZ3M9Qzovd29ya3NwYWNlMS9keW5hbWljV2ViUHJvamVjdE5hbWUvYmluZGluZzEueG1sLEM6L3dvcmtzcGFjZTEvZHluYW1pY1dlYlByb2plY3ROYW1lL2JpbmRpbmcyLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2FudC9jeGZfdGRqYXZhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3OWM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9hbnQvY3hmX3RkamF2YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0KLTxlY2hvIG1lc3NhZ2U9InB1bGxpbmcgaW4gcHJvcGVydHkgZmlsZXMiLz4KLTxwcm9wZXJ0eSBmaWxlPSJjeGZfdGRqYXZhLnByb3BlcnRpZXMiLz4KLQkKLTxlY2hvIG1lc3NhZ2U9ImNhbGxpbmcgdGhlIHdlYiBzZXJ2aWNlcyBnZW5lcmF0aW9uIGFudCB0YXNrOiBjeGZfdGRqYXZhIi8+Ci0gPHRhcmdldCBuYW1lPSJtYWluIiA+Ci0gIAkgPHdzZ2VuLz4KLSAgPC90YXJnZXQ+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYWQ1Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYW50LwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjZjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ29uc3VtcHRpb24gQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ1hGPUFwYWNoZSBDWEYgV2ViIFNlcnZpY2UgTG9jYXRvcgotV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9DWEY9QXBhY2hlIENYRiBDb21wb25lbnRzCi0KLUxBQkVMX1JVTlRJTUVfQ1hGPUFwYWNoZSBDWEYKLUxBQkVMX0JPVFRPTV9VUF9KQVZBX0JFQU49Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZQotTEFCRUxfVE9QX0RPV05fSkFWQV9CRUFOPVRvcCBkb3duIEphdmEgYmVhbiBXZWIgU2VydmljZQotTEFCRUxfQ0xJRU5UPUNsaWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzc0NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzLmxvY2F0b3IiPgotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yQ2F0ZWdvcnkKLSAgICAgICAgIGlkPSJ3cy5sb2NhdG9yLmNhdGVnb3J5LmN4ZiIKLSAgICAgICAgIGxhYmVsPSIlV0VCX1NFUlZJQ0VfTE9DQVRPUl9DQVRFR09SWV9DWEYiLz4KLQotICAgICAgPHdlYlNlcnZpY2VMb2NhdG9yCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmxvY2F0b3IuQ1hGV2ViU2VydmljZUxvY2F0b3IiCi0gICAgICAgICBpZD0id3MubG9jYXRvci5jeGYiCi0gICAgICAgICBjYXRlZ29yeT0id3MubG9jYXRvci5jYXRlZ29yeS5jeGYiCi0gICAgICAgICBsYWJlbD0iJVdFQl9TRVJWSUNFX0xPQ0FUT1JfQ1hGIj4KLSAgICAgIDwvd2ViU2VydmljZUxvY2F0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLmFudGZpbGVzIj4KLSAgICAgIDxhbnRmaWxlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY3hmV2ViU2VydmljZVJUQlVKYXZhIgotICAgIAkgcnVudGltZWlkPSJjeGYiCi0gICAgCSBwbHVnaW5sb2NhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotICAgIAkgcGF0aD0iYW50L2N4Zl9idWphdmEucHJvcGVydGllcyIKLSAgICAJIHdzZ2VucGF0aD0iYW50L2N4Zl9idWphdmEueG1sIgotICAgIAkgcnVudGltZWxhYmVsPSIlTEFCRUxfUlVOVElNRV9DWEYiCi0gICAgCSBzY2VuYXJpb2xhYmVsPSIlTEFCRUxfQk9UVE9NX1VQX0pBVkFfQkVBTiI+Ci0gIAkgIDwvYW50ZmlsZXM+Ci0gICAgICA8YW50ZmlsZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmN4ZldlYlNlcnZpY2VSVFRvcEphdmEiCi0gICAgICAgICBydW50aW1laWQ9ImN4ZiIKLSAgICAgICAgIHBsdWdpbmxvY2F0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiCi0gICAgICAgICBwYXRoPSJhbnQvY3hmX3RkamF2YS5wcm9wZXJ0aWVzIgotICAgICAgICAgd3NnZW5wYXRoPSJhbnQvY3hmX3RkamF2YS54bWwiCi0gICAgICAgICBydW50aW1lbGFiZWw9IiVMQUJFTF9SVU5USU1FX0NYRiIKLSAgICAgICAgIHNjZW5hcmlvbGFiZWw9IiVMQUJFTF9UT1BfRE9XTl9KQVZBX0JFQU4iPgotICAJICA8L2FudGZpbGVzPgotICAJICA8YW50ZmlsZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmN4ZldlYlNlcnZpY2VSVFpDbGllbnQiCi0gICAgICAgICBydW50aW1laWQ9ImN4ZiIKLSAgICAgICAgIHBsdWdpbmxvY2F0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiCi0gICAgICAgICBwYXRoPSJhbnQvY3hmX2NsaWVudC5wcm9wZXJ0aWVzIgotICAgICAgICAgd3NnZW5wYXRoPSJhbnQvY3hmX2NsaWVudC54bWwiCi0gICAgICAgICBydW50aW1lbGFiZWw9IiVMQUJFTF9SVU5USU1FX0NYRiIKLSAgICAgICAgIHNjZW5hcmlvbGFiZWw9IiVMQUJFTF9DTElFTlQiPgotICAgICAgPC9hbnRmaWxlcz4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZWIwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5DWEZDb25zdW1wdGlvbkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMuQlVORExFX05BTUUsIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvQ1hGQ29uc3VtcHRpb25Db3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5ODBiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9DWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkyMGZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL0NYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4oKSB7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcGx1Z2luID0gbnVsbDsKLSAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvbnN1bXB0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MjVmZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDbGllbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ29tbWFuZExpbmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5MYXVuY2hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIEV4ZWN1dGVzIHRoZSA8Y29kZT5vcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YTwvY29kZT4gY29tbWFuZCB3aXRoIHRoZSBhcmd1bWVudHMKLSAqIG5lY2Vzc2FyeSB0byBnZW5lcmF0ZSBhIGNsaWVudC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+V1NETDJKYXZhQ2xpZW50Q29tbWFuZDwvY29kZT4gb2JqZWN0LgotICAgICAqIEBwYXJhbSBtb2RlbCB0aGUgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPiB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24KLSAgICAgKiBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnRDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLAotICAgICAgICAgICAgICAgIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhR2VuZXJhdGVDbGllbnRBcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBMYXVuY2hVdGlscy5sYXVuY2goamF2YVByb2plY3QsIFdTREwySmF2YUNsaWVudENvbW1hbmQuQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAodGhpcy5tb2RlbCk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy9BTlQgRW52aXJvbm1lbnQgTWFwcGluZ3MKLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU291cmNlRm9sZGVyKFN0cmluZyBqYXZhU291cmNlRm9sZGVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIG1vZGVsLnNldFNlcnZpY2VOYW1lKHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGdlbmVyYXRlSW1wbGVtZW50YXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB1c2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGJvb2xlYW4gcHJvY2Vzc1NPQVBIZWFkZXJzKSB7Ci0gICAgICAgIG1vZGVsLnNldFByb2Nlc3NTT0FQSGVhZGVycyhwcm9jZXNzU09BUEhlYWRlcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGJvb2xlYW4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcobG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIGF1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBtb2RlbC5zZXRBdXRvTmFtZVJlc29sdXRpb24oYXV0b05hbWVSZXNvbHV0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4geGpjVXNlRGVmYXVsdFZhbHVlcykgewotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY1VzZURlZmF1bHRWYWx1ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4geGpjVG9TdHJpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4geGpjVG9TdHJpbmdTaW1wbGUpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGJvb2xlYW4geGpjVG9TdHJpbmdNdWx0aUxpbmUpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoeGpjVG9TdHJpbmdNdWx0aUxpbmUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY0xvY2F0b3IoYm9vbGVhbiB4amNMb2NhdG9yKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY0xvY2F0b3IoeGpjTG9jYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjU3luY01ldGhvZHMoYm9vbGVhbiB4amNTeW5jTWV0aG9kcykgewotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTWFya0dlbmVyYXRlZChib29sZWFuIHhqY01hcmtHZW5lcmF0ZWQpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZCh4amNNYXJrR2VuZXJhdGVkKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoTWFwIHZhbHVlKSB7Ci0gICAgICAgIG1vZGVsLnNldEluY2x1ZGVkTmFtZXNwYWNlcyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmluZGluZ0ZpbGVzKExpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IGJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuYWRkKHBhdGgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBiNDgwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LldTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci0KLS8qKgotICogTG9hZHMgdGhlIDxjb2RlPldTREwySmF2YURhdGFNb2RlbDwvY29kZT4gd2l0aCB0aGUgcGVyc2lzdGVkIGRlZmF1bHRzCi0gKiBmcm9tIHRoZSBwcmVmZXJlbmNlcyBhbmQgd2l0aCB0aGUgaW5pdGlhbCBydW50aW1lIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlCi0gKiBzdGFydGluZyBwb2ludCBXU0RMIFVSTC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dFVSTDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYSBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZCBvYmplY3QuCi0gICAgICogQHBhcmFtIG1vZGVsIHRoZSA8Y29kZT5XU0RMMkphdmFEYXRhTW9kZWw8L2NvZGU+IHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbgotICAgICAqICAgICAgICAgICAgICBiZXR3ZWVuIGNvbW1hbmRzLgotICAgICAqLwotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGlucHV0VVJMKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLmlucHV0VVJMID0gaW5wdXRVUkw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLQotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtb2RlbC5zZXRFeGNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgICAgIC8vIFhKQwotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZyhjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyhjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0VmFsaWRhdGUoY29udGV4dC5pc1ZhbGlkYXRlKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMoY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldE5vQWRkcmVzc0JpbmRpbmcoY29udGV4dC5pc05vQWRkcmVzc0JpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotCi0gICAgICAgIG1vZGVsLnNldEphdmFTb3VyY2VGb2xkZXIoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3RTb3VyY2VEaXJlY3RvcnlQYXRoKG1vZGVsLmdldFByb2plY3ROYW1lKCkpLnRvT1NTdHJpbmcoKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB3c2RsVXJsID0gbmV3IFVSTChpbnB1dFVSTCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxVcmwpOwotCi0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwobW9kZWwuZ2V0V3NkbFVSTCgpKTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZGVmaW5pdGlvbi5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkucHV0KHRhcmdldE5hbWVzcGFjZSwgcGFja2FnZU5hbWUpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExVdGlscy5nZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxMb2NhdGlvbih3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFdzZGxEZWZpbml0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdXJsZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBtdXJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDb25zdW1wdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhRGF0YU1vZGVsIGdldFdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL2NvcmUvbG9jYXRvci9DWEZXZWJTZXJ2aWNlTG9jYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9sb2NhdG9yL0NYRldlYlNlcnZpY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vY29yZS9sb2NhdG9yL0NYRldlYlNlcnZpY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUubG9jYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5KMkVFVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzZmluZGVyLkFic3RyYWN0V2ViU2VydmljZUxvY2F0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQ1hGV2ViU2VydmljZUxvY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VMb2NhdG9yIHsKLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBMaXN0IGdldFdlYlNlcnZpY2VDbGllbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0V2ViU2VydmljZUNsaWVudHMobW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZUNsaWVudHMoSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRXZWJTZXJ2aWNlQ2xpZW50cyhwcm9qZWN0cywgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgICAgIHJldHVybiBnZXRXZWJTZXJ2aWNlcyhwcm9qZWN0cywgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIExpc3QgZ2V0V2ViU2VydmljZXMoSVByb2plY3RbXSBwcm9qZWN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgICAgIExpc3Qgd2ViU2VydmljZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoSVByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAoSjJFRVV0aWxzLmlzV2ViQ29tcG9uZW50KHByb2plY3QpKSB7Ci0gICAgICAgICAgICAgICAgd2ViU2VydmljZXMuYWRkQWxsKGdldFdlYlNlcnZpY2VzRnJvbVByb2plY3QocHJvamVjdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3ZWJTZXJ2aWNlczsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIExpc3QgZ2V0V2ViU2VydmljZXNGcm9tUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcyMWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzU4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTMgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzIxNTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud3NydDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuMy40IiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk7YnVuZGxlLXZlcnNpb249IjAuMy41IiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGI4ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZGU4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDb25zdW1wdGlvbiBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpBWFdTX1dFQlNFUlZJQ0VUWVBFPVBPSk8gV2ViIFNlcnZpY2UKLQotSkFYV1NfQ0xJRU5UPUpBWC1XUyBTdHViClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk5ODFhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkud3NJbXBsIj4KLSAgICAgICAgPHdlYlNlcnZpY2VJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi53c0ltcGwuamF2YSIKLSAgICAgICAgICAgIGxhYmVsPSIlSkFYV1NfV0VCU0VSVklDRVRZUEUiCi0gICAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhZGF0YT0iRmlsZSBJUmVzb3VyY2UgQ29tcGlsYXRpb25Vbml0IgotICAgICAgICAgICAgZXh0ZW5zaW9uTWV0YWRhdGE9Ii5qYXZhIC5jbGFzcyIKLSAgICAgICAgICAgIG9iamVjdFNlbGVjdGlvbldpZGdldD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5DWEZKQVhXU1NlbGVjdGlvbldpZGdldCIKLSAgICAgICAgICAgIG1lcmdlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkphdmFNZXJnZXIiPgotICAgICAgICA8L3dlYlNlcnZpY2VJbXBsPgotICAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICAgPCEtLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS53c0NsaWVudEltcGwiPgotICAgICAgPHdlYlNlcnZpY2VDbGllbnRJbXBsCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jbGllbnQudHlwZS5qYXZhIgotICAgICAgICAgICAgbGFiZWw9IiVKQVhXU19DTElFTlQiPgotICAgICAgPC93ZWJTZXJ2aWNlQ2xpZW50SW1wbD4KLSAgICA8L2V4dGVuc2lvbj4tLT4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5vYmplY3RTZWxlY3Rpb25XaWRnZXQiPgotICAgICAgICA8b2JqZWN0U2VsZWN0aW9uV2lkZ2V0Ci0gICAgICAgICAgICBjbGFzcz0iIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUiCi0gICAgICAgICAgICBleHRlcm5hbF9tb2RpZnk9InRydWUiCi0gICAgICAgICAgICBpZD0iIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5vYmplY3QuQ1hGSkFYV1NTZWxlY3Rpb25XaWRnZXQiCi0gICAgICAgICAgICB0cmFuc2Zvcm1lcj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzLm9iamVjdC5KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyIj4KLSAgICAgICAgPC9vYmplY3RTZWxlY3Rpb25XaWRnZXQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9IldTREwySmF2YUNsaWVudENvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIj4KLSAgICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBXU0RMMkphdmEgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmFudERhdGFNYXBwaW5nIj4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJNYXBwaW5ncyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJJbmNsdWRlZE5hbWVzcGFjZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuZW52LmFudC5NYXBwaW5nc1RyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iQmluZGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQmluZGluZ0ZpbGVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuQmluZGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkphdmFPdXRwdXQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSmF2YVNvdXJjZUZvbGRlciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlNlcnZpY2VOYW1lIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlNlcnZpY2VOYW1lIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuQ2xpZW50IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlQ2xpZW50IgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuU2VydmVyIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuSW1wbCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZUltcGxlbWVudGF0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJVc2VEZWZhdWx0VmFsdWVzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRXh0U09BUEhlYWRlcnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iUHJvY2Vzc1NPQVBIZWFkZXJzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iRGVmYXVsdE5hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRFeGNsdWRlc05hbWVzcGFjZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkF1dG9OYW1lUmVzb2x1dGlvbiIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfZHYiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190cyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19tdWx0aSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNUb1N0cmluZ011bHRpTGluZSIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY190c19zaW1wbGUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ2xpZW50Q29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdTaW1wbGUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbG9jYXRvciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNMb2NhdG9yIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX3N5bmNfbWV0aG9kcyIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNTeW5jTWV0aG9kcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19tYXJrX2dlbmVyYXRlZCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDbGllbnRDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJYamNNYXJrR2VuZXJhdGVkIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NDdiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gCi0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQ0xJRU5UX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0NsSUVOVF9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9DTElFTlRfREVGQVVMVFNfUEFHRV9ERVNDUklQVElPTjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUw7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuQlVORExFX05BTUUsIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDA2YjU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJTWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1DWEZKQVhXU1NFTEVDVElPTkxBVU5DSEFCTEVfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1Ccm93c2UgV29ya3NwYWNlIENsYXNzZXMgYW5kIEludGVyZmFjZXMKLUNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0U9U2VsZWN0IHRoZSBKYXZhIENsYXNzIG9yIEludGVyZmFjZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBXZWIgU2VydmljZQotCi0jV1NETDJKYXZhIENsaWVudCBDb25naWggV2lkZ2V0IEZhY3RvcnkKLVdTREwySkFWQV9DTElFTlRfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLVdTREwySkFWQV9DbElFTlRfREVGQVVMVFNfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIFdTREwySmF2YSBDbGllbnQgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPUN1c3RvbWlzZSB5b3VyIFdlYiBTZXJ2aWNlIGdlbmVyYXRpb24gYnkgc2VsZWN0aW5nIG9wdGlvbnMgb24gdGhpcyBwYWdlCi0KLSNXU0RMMkphdmEgQ2xpZW50IERlZmF1bHRzIENvbmZpZyBXaWRnZXQKLVdTREwySkFWQV9HUk9VUF9MQUJFTD1XU0RMMkphdmEgR2VuZXJhdGlvbiBPcHRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTD1YSkMgQXJndW1lbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS9DWEZDb25zdW1wdGlvblVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWI1ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL0NYRkNvbnN1bXB0aW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDb25zdW1wdGlvblVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvQ1hGSkFYV1NTZWxlY3Rpb25MYXVuY2hhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzZDFkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9DWEZKQVhXU1NlbGVjdGlvbkxhdW5jaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5SZXNvdXJjZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLkFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLkNYRkNvbnN1bXB0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRkpBWFdTU2VsZWN0aW9uTGF1bmNoYWJsZSBleHRlbmRzIEFic3RyYWN0T2JqZWN0U2VsZWN0aW9uTGF1bmNoYWJsZSB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIAotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJDb21wb25lbnROYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZSA9ICIiOwotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbikgewotICAgICAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICFpbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gZmlyc3RFbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGxhdW5jaChTaGVsbCBzaGVsbCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhzaGVsbCwKLSAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nCi0gICAgICAgICAgICAgICAgLnNldE1lc3NhZ2UoQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzLkNYRkpBWFdTU0VMRUNUSU9OTEFVTkNIQUJMRV9TRUxFQ1RJT05fRElBTE9HX01FU1NBR0UpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICBzZWxlY3Rpb25EaWFsb2cuYWRkRmlsdGVyKG5ldyBKYXZhVmlld2VyRmlsdGVyKCkpOwotCi0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IEphdmFTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSk7Ci0KLSAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICBpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgdHlwZVJlc291cmNlID0gdHlwZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZVJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gdHlwZVJlc291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IFJlc291cmNlVXRpbHMuZ2V0Q29tcG9uZW50T2YodHlwZVJlc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRTZXZlcml0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIElTdGF0dXMuQ0FOQ0VMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRPYmplY3RTZWxlY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZlckNvbXBvbmVudE5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uU2VydmljZSBzZWxlY3Rpb25TZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3Rpb25TZXJ2aWNlKCk7Ci0gICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgVHJlZVNlbGVjdGlvbiB0cmVlU2VsZWN0aW9uID0gKFRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBPYmplY3QgZmlyc3RFbGVtZW50ID0gdHJlZVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QgPSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBvYmplY3RTZWxlY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRPYmplY3RTZWxlY3Rpb25EaXNwbGF5YWJsZVN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShTdHJpbmcgc3RyaW5nVG9WYWxpZGF0ZSkgewotICAgICAgICBjbGFzc05hbWUgPSBzdHJpbmdUb1ZhbGlkYXRlOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShjbGFzc05hbWUpOwotICAgICAgICB9Ci0KLS8vICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotLy8gICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKLS8vICAgICAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmdldFR5cGUocHJvamVjdCwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotLy8gICAgICAgICAgICAgICAgdmFsaWRhdGlvblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLS8vICAgICAgICAgICAgfSBlbHNlIHsKLS8vICAgICAgICAgICAgICAgIHZhbGlkYXRpb25TdGF0dXMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShwcm9qZWN0LmdldE5hbWUoKSwgY2xhc3NOYW1lKTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0vLyAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsaWRhdGlvblN0YXR1cy5pc09LKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEphdmFWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50Lmhhc0NoaWxkcmVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NsYXNzKCkgfHwgdHlwZS5pc0ludGVyZmFjZSgpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmF2YVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotICAgICAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZDb25zdW1wdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29uc3VtcHRpb25VSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5NGY4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzLlBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcjsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gLTE7Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgQ29tYm8gb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBQYWNrYWdlIE5hbWU6Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBmaW5hbCBUZXh0IHBhY2thZ2VOYW1lVGV4dCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwYWNrYWdlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA3OwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnBhY2soKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gZ2V0TmFtZXNwYWNlTWFwcGluZ0NvbXBvc2l0ZShuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IGdyb3VwU2l6ZSA9IG5hbWVzcGFjZUNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IGdyb3VwU2l6ZS55OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55ICsgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLmxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIucGFjaygpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIubGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGwuc2V0U2l6ZShzaGVsbFNpemUueCwgc2hlbGxTaXplLnkgLSBuYW1lc3BhY2VDb21wb3NpdGVIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIFNlcnZpY2UgTmFtZToKLSAgICAgICAgLy8gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gICAgICAgIENvbWJvIHNlcnZpY2VOYW1lQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lQ29tYm8obWFpbkNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICAvLyAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIC8vICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIC8vICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGJpbmRpbmdGaWxlc0xhYmVsID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVCaW5kaW5nRmlsZXNMYWJlbChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMaXN0IGJpbmRpbmdGaWxlc0xpc3QgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24obWFpbkNvbXBvc2l0ZSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQmluZGluZ0ZpbGVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVSZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLAotICAgICAgICAgICAgICAgIG1vZGVsLCBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICAvKgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBUZXh0IHhtbENhdGFsb2dUZXh0ID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYTUxDYXRhbG9nVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB4bWxDYXRhbG9nVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dCcm93c2VCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGFibGUgY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLSAgICAgICAgZmluYWwgVGFibGUgcGFja2FnZU5hbWVUYWJsZSA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVDb2x1bW4oCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlciwgbW9kZWwpOwotCi0gICAgICAgIFRleHRDZWxsRWRpdG9yIHRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKSk7Ci0gICAgICAgIHRleHRDZWxsRWRpdG9yLmFkZExpc3RlbmVyKCBuZXcgSUNlbGxFZGl0b3JMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXRvcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgdGV4dENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydChwYWNrYWdlTmFtZVRhYmxlVmlld2VyLAotICAgICAgICAgICAgICAgIHRleHRDZWxsRWRpdG9yLCBtb2RlbCkpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDEwMCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0KLSAgICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNvbnRhaW5zS2V5KHRhYmxlSXRlbS5nZXRUZXh0KDApKSkgewotICAgICAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRhYmxlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIGdldE5hbWVzcGFjZU1hcHBpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIHBhY2thZ2VOYW1lVGFibGUgPSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUobmFtZXNwYWNlQ29tcG9zaXRlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZUNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnRDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODI4YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YUNsaWVudENvbmZpZ1dpZGdldCB3c2RsMkphdmFDb25maWdXaWRnZXQgPSBuZXcgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0KCk7Ci0gICAgcHJpdmF0ZSBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmICh3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvciA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDbGllbnREZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ2xpZW50Q29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFDbGllbnRXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFDbGllbnRQYWdlVGl0bGUgPSBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX1RJVExFLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHdzZGwySmF2YUNsaWVudFBhZ2VUaXRsZSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudFdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50V2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFDbGllbnREZWZhdWx0c1BhZ2VUaXRsZSA9IENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfQ2xJRU5UX0RFRkFVTFRTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpfSk7Ci0gICAgICAgIHdzZGwySmF2YUNsaWVudERlZmF1bHRzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUod3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFDbGllbnREZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0NMSUVOVF9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhQ2xpZW50RGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ2xpZW50RGVmYXVsdHNDb25maWdXaWRnZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM0OWY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS5DWEZDb25zdW1wdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0RGF0YUV2ZW50czsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDbGllbnREZWZhdWx0c0NvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZDb25zdW1wdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0KHdzZGwyamF2YWxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVNlcnZlckJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotCi0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkuY29tcGFyZVRvKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKSA+PSAwKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRkNvbnN1bXB0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVGFibGUgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTG9jYXRvclRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9vYmplY3QvSkFYV1NTZWxlY3Rpb25UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDE3ZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93aWRnZXRzL29iamVjdC9KQVhXU1NlbGVjdGlvblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndpZGdldHMub2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29uc3VtcHRpb24udWkuQ1hGQ29uc3VtcHRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpBWFdTU2VsZWN0aW9uVHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZhbHVlOwotICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGlvbiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUgPSB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZ1bGx5UXVhbGlmaWVkSmF2YU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKChJQ29tcGlsYXRpb25Vbml0KSBzZWxlY3Rpb24pLmdldFJlc291cmNlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFOYW1lID0gdGhpcy5nZXRGdWxseVF1YWxpZmllZEphdmFOYW1lKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZnVsbHlRdWFsaWZpZWRKYXZhTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJ1Y3R1cmVkU2VsZWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFOYW1lKElGaWxlIHJlc291cmNlKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0KLSAgICAgICAgaWYgKHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBqYXZhRmlsZU5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0KLSAgICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQYXRoIGphdmFGb2xkZXJQYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0gICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZmluZFBhY2thZ2VGcmFnbWVudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFGb2xkZXJQYXRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkgKyAiLiIgKyBqYXZhRmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb25zdW1wdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhRmlsZU5hbWU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvbnN1bXB0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZUNsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA4NmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb25zdW1wdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2VDbGllbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvbnN1bXB0aW9uLnVpLndzcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNsaWVudERlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW52aXJvbm1lbnQuSUVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LkFic3RyYWN0V2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VDbGllbnRJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2VDbGllbnQgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VDbGllbnQgewotCi0gICAgcHVibGljIENYRldlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykgewotICAgICAgICBzdXBlcihpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnYsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWwsIFN0cmluZyBwcm9qZWN0LAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBkZXBsb3koSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGRldmVsb3AoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3ROYW1lLAotICAgICAgICAgICAgU3RyaW5nIGVhclByb2plY3QpIHsKLQotICAgICAgICBWZWN0b3IgY29tbWFuZHMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIHdzZGwySmF2YU1vZGVsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0gICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhQ2xpZW50RGVmYXVsdGluZ0NvbW1hbmQod3NkbDJKYXZhTW9kZWwsIHByb2plY3ROYW1lLCAKLSAgICAgICAgCQlnZXRXZWJTZXJ2aWNlQ2xpZW50SW5mbygpLmdldFdzZGxVUkwoKSkpOwotICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YUNsaWVudENvbW1hbmQod3NkbDJKYXZhTW9kZWwpKTsKLQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoSUVudmlyb25tZW50IGVudiwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbCwgU3RyaW5nIHByb2plY3QsCi0gICAgICAgICAgICBTdHJpbmcgZWFyUHJvamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IHJ1bihJRW52aXJvbm1lbnQgZW52LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsLCBTdHJpbmcgcHJvamVjdCwKLSAgICAgICAgICAgIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzI4MDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMjMyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGU4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NCBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBhZjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMy5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSxvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUsb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWksCi0gICBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24uY29yZSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDIuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMS43LjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY29uc29sZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjIwNCwxLjEuMCkiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1JbXBvcnQtUGFja2FnZTogamF2YXguandzLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmpkb207dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLmlucHV0O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuamRvbS5vdXRwdXQ7dmVyc2lvbj0iMS4wLjAiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgZmVhdHVyZSBkZXRhaWxzIGluIHRoZSAiQWJvdXQiIAotIyBkaWFsb2cgKHRyYW5zbGF0ZWQpLiAgTWF4aW11bSAxNSBsaW5lcyBhbmQgNzUgY2hhcmFjdGVycyBwZXIgbGluZS4KLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5OTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1DWEYgV2ViIFNlcnZpY2VzIChJbmN1YmF0aW9uKVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgSU9OQSBUZWNobm9sb2dpZXMgUExDIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9pbmN1YmF0b3IvXG5cCi1cbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2JhMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgam1lcmdlci8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ljb25zL3ZpZXcxNi9jb25zb2xlX3ZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OThmNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvaWNvbnMvdmlldzE2L2NvbnNvbGVfdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9qbWVyZ2VyL21lcmdlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJkZDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL2ptZXJnZXIvbWVyZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gTWVyZ2UgcnVsZXMgdXNlZCBieSBKTWVyZ2VyIC0tPgotPG1lcmdlOm9wdGlvbnMgCi0JeG1sbnM6bWVyZ2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2VjbGlwc2UvZW1mL2NvZGVnZW4vam1lcmdlL09wdGlvbnMiPgotCQotCTwhLS0gaWYgdGFyZ2V0IGlzIGdlbmVyYXRlZCwgdHJhbnNmZXIgLS0+Ci0gICAgPCEtLSBjaGFuZ2UgdG8gc291cmNlTWFya3VwIGlmIHRoZSBzb3VyY2UgaXMgdGhlIHN0YW5kYXJkIC0tPgotICAgIDxtZXJnZTpwdWxsIAotICAgICAgICBzb3VyY2VHZXQ9Ik1ldGhvZC9nZXRCb2R5IgotICAgICAgICBzb3VyY2VUcmFuc2Zlcj0iKFxzKi8vXHMqYmVnaW4tdXNlci1jb2RlLio/Ly9ccyplbmQtdXNlci1jb2RlXHMqKVxuIgotICAgICAgICB0YXJnZXRQdXQ9Ik1ldGhvZC9zZXRCb2R5Ii8+Ci0JCi0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldFJldHVyblR5cGUiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9zZXRSZXR1cm5UeXBlIi8+Ci0JPG1lcmdlOnB1bGwgCi0JCXNvdXJjZUdldD0iTWV0aG9kL2dldEV4Y2VwdGlvbnMiIAotCQl0YXJnZXRQdXQ9Ik1ldGhvZC9hZGRFeGNlcHRpb24iLz4KLQkKLSAgICA8bWVyZ2U6cHVsbAotICAgICAgc291cmNlR2V0PSJNZW1iZXIvZ2V0Q29tbWVudCIKLSAgICAgIHRhcmdldFB1dD0iTWVtYmVyL3NldENvbW1lbnQiLz4KLSAgICA8bWVyZ2U6cHVsbAotICAgICAgIHNvdXJjZUdldD0iSW1wb3J0L2dldE5hbWUiCi0gICAgICAgdGFyZ2V0UHV0PSJJbXBvcnQvc2V0TmFtZSIvPgotICAgIDxtZXJnZTpwdWxsCi0gICAgICAgc291cmNlR2V0PSJDb21waWxhdGlvblVuaXQvZ2V0SGVhZGVyIgotICAgICAgIHRhcmdldFB1dD0iQ29tcGlsYXRpb25Vbml0L3NldEhlYWRlciIvPgotCi08IS0tIE1lcmdlIHJ1bGVzIHRvIGhhbmRsZSBhbm5vdGF0aW9uOgotCS0gV2l0aCB0aGlzIHB1bGwgcnVsZSwgYW5ub3RhdGlvbnMgaW4gdGhlIHRhcmdldCBpcyByZXBsYWNlZCBieSBhbm5vdGF0aW9ucyBvZiB0aGUgCi0Jc2FtZSBuYW1lIGluIHRoZSBzb3VyY2UuCi0JLSBXaXRoIHRoaXMgc3dlZXAgcnVsZSwgYW55IGFubm90YXRpb24gaW4gdGhlIHRhcmdldCB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIAotICAJc291cmNlIGlzIGNvbW1lbnRlZCBvdXQuIAotICAJLSBCeSBkZWZhdWx0LCBhbnkgYW5ub3RhdGlvbiBpbiB0aGUgc291cmNlIHRoYXQgaXMgbm90IGluIHRoZSB0YXJnZXQgYXJlIHB1bGxlZCBpbnRvIHRoZSB0YXJnZXQuCi0tLT4KLQotCTxtZXJnZTpwdWxsIAotICAgIAlzb3VyY2VHZXQ9IkFubm90YXRpb24vZ2V0Q29udGVudHMiCi0gICAgCXRhcmdldFB1dD0iQW5ub3RhdGlvbi9zZXRDb250ZW50cyIvPgotICAgCi0gIAk8bWVyZ2U6c3dlZXAgc2VsZWN0PSJBbm5vdGF0aW9uIiBhY3Rpb249ImNvbW1lbnQiLz4KLQkJCi08L21lcmdlOm9wdGlvbnM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNzlmMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1vZGVsIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbCI+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ1hGQ29udGV4dCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRSdW50aW1lTG9jYXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFJ1bnRpbWVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRSdW50aW1lVmVyc2lvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJib3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUFudEJ1aWxkRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ2xpZW50IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVTZXJ2ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXRhYmluZGluZyIgZVR5cGU9IiMvL0RhdGFCaW5kaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJqYXhiIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb250ZW5kIiBlVHlwZT0iIy8vRnJvbnRlbmQiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImpheHdzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnN0YWxsYXRpb25zIiB0cmFuc2llbnQ9InRydWUiPgotICAgICAgPGVHZW5lcmljVHlwZSBlQ2xhc3NpZmllcj0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FTWFwIj4KLSAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSIjLy9DWEZJbnN0YWxsIi8+Ci0gICAgICA8L2VHZW5lcmljVHlwZT4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNYRkRhdGFNb2RlbCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9DWEZDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VEaXJlY3RvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NEaXJlY3RvcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbEZpbGVOYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxVUkwiIGVUeXBlPSIjLy9VUkwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uZmlnV3NkbExvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpZ0lkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRwb2ludE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VydmljZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id3NkbERlZmluaXRpb24iIGVUeXBlPSIjLy9EZWZpbml0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxMb2NhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhMldTQ29udGV4dCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9DWEZDb250ZXh0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcDEyQmluZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlWFNESW1wb3J0cyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVXU0RMIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSmF2YTJXU0RhdGFNb2RlbCIgZVN1cGVyVHlwZXM9IiMvL0NYRkRhdGFNb2RlbCAjLy9KYXZhMldTQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzcGF0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhU3RhcnRpbmdQb2ludCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dHJhY3RJbnRlcmZhY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0aG9kTWFwIj4KLSAgICAgIDxlR2VuZXJpY1R5cGUgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgIDxlVHlwZUFyZ3VtZW50cyBlQ2xhc3NpZmllcj0iIy8vSU1ldGhvZCIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9IiMvL01hcCI+Ci0gICAgICAgICAgPGVUeXBlQXJndW1lbnRzIGVDbGFzc2lmaWVyPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICAgICAgPC9lVHlwZUFyZ3VtZW50cz4KLSAgICAgIDwvZUdlbmVyaWNUeXBlPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYW5ub3RhdGlvbk1hcCI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICAgIDwvZUdlbmVyaWNUeXBlPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRGlyZWN0b3J5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvcnROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldTREwySmF2YUNvbnRleHQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQ1hGQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlSW1wbGVtZW50YXRpb24iCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2Nlc3NTT0FQSGVhZGVycyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsaWRhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndzZGxWZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxLjEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlRGVmYXVsdFZhbHVlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjQXJncyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub0FkZHJlc3NCaW5kaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjVXNlRGVmYXVsdFZhbHVlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY1RvU3RyaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieGpjVG9TdHJpbmdNdWx0aUxpbmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNUb1N0cmluZ1NpbXBsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY0xvY2F0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNTeW5jTWV0aG9kcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InhqY01hcmtHZW5lcmF0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ4amNFcGlzb2RlRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRvTmFtZVJlc29sdXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXU0RMMkphdmFEYXRhTW9kZWwiIGVTdXBlclR5cGVzPSIjLy9DWEZEYXRhTW9kZWwgIy8vV1NETDJKYXZhQ29udGV4dCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVkTmFtZXNwYWNlcyI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiaW5kaW5nRmlsZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVkTmFtZXNwYWNlcyI+Ci0gICAgICA8ZUdlbmVyaWNUeXBlIGVDbGFzc2lmaWVyPSIjLy9NYXAiPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgICA8ZVR5cGVBcmd1bWVudHMgZUNsYXNzaWZpZXI9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgICAgPC9lR2VuZXJpY1R5cGU+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nRmlsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqYXZhU291cmNlRm9sZGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRnJvbnRlbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSkFYV1MiIGxpdGVyYWw9ImpheHdzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRGF0YUJpbmRpbmciPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSkFYQiIgbGl0ZXJhbD0iamF4YiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVUkwiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkwiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZpbml0aW9uIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YXgud3NkbC5EZWZpbml0aW9uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWFwIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLk1hcCI+Ci0gICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUIi8+Ci0gICAgPGVUeXBlUGFyYW1ldGVycyBuYW1lPSJUMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJTWV0aG9kIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNYRkluc3RhbGwiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2F0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvbW9kZWwvQ1hGLmVjb3JlX2RpYWdyYW0gYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmVfZGlhZ3JhbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMzMjNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZWNvcmVfZGlhZ3JhbQorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG5vdGF0aW9uOkRpYWdyYW0geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjEvbm90YXRpb24iIHhtaTppZD0iX3lyVU4wZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IkVjb3JlIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SnRhQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDAxIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDEiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xBZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDEiPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxa091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUxvY2F0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWtldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWt1dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVFZGl0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWstdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWxPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVWZXJzaW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MWxldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfelM4MWx1dWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3ZlcmJvc2UiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbC11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVBbnRCdWlsZEZpbGUiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbXV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVDbGllbnQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxbk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVTZXJ2ZXIiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96UzgxbmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96UzgxbnV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZGF0YWJpbmRpbmciLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxbi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxb091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvZnJvbnRlbmQiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il96Uzgxb2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96Uzgxb3V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL0NYRkNvbnRleHQvdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0Ii8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfelM4MW8tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfLUlod29PdW5FZDJwZkltVDFqVDd2USIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1JaHdvZXVuRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEF1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEJPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMQmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMQnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xCLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMQ091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xDZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xDdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEMtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xET3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKdGFBZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0Ii8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfekp0YUF1dWtFZDJwZkltVDFqVDd2USIgeD0iNDY1IiB5PSIxNSIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEVPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTEVldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEV1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMRS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEZPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMRmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMRnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xGLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMR091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xHZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xHdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEctdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xIT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKM0xEdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SjNMRC11a0VkMnBmSW1UMWpUN3ZRIiB4PSI0NjUiIHk9IjI5MCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xIZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTElPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTElldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfekozTEl1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMSS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfekozTEpPdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMSmV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAyIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMSnV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xKLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMS091a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xLZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDMiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xLdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTEstdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xMT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pKM0xIdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUNsYXNzIiBocmVmPSJDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pKM0xILXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMjkwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfekozTExldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96SjNMTWV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96SjNMTXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pKM0xNLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96SjNMTk91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pKM0xOZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pKM0xOdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfekozTE4tdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pKM0xPT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVThPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVThldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVOHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVTgtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfekozTEx1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwiLz4KLSAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il96SjNMTC11a0VkMnBmSW1UMWpUN3ZRIiB4PSIyMzAiIHk9IjYyMCIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVU5T3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDEiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVTktdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwMSIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVS1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMSI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZXpJQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9nZW5lcmF0ZUltcGxlbWVudGF0aW9uIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dleklSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dlekloOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3Byb2Nlc3NTT0FQSGVhZGVycyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFNQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFNUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFNaDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFNeDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3ZmFOQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3ZmFOUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC92YWxpZGF0ZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JRQjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z0JRUjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC93c2RsVmVyc2lvbiIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z0JRaDkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z0JReDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC91c2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnQlJCOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3dnQlJSOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0FyZ3MiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2dCUmg5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2dvVUI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvbm9BZGRyZXNzQmluZGluZyIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3Z29VUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3Z29VaDkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNVc2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3dnb1V4OTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFlCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFlSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFloOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nTXVsdGlMaW5lIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFl4OTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doUFpCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nU2ltcGxlIi8+Ci0gICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfY3doUFpSOTJFZDZJNXN3bHJzbjM3ZyIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfY3doMmNCOTJFZDZJNXN3bHJzbjM3ZyIgdHlwZT0iMzAwMSI+Ci0gICAgICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBocmVmPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY0xvY2F0b3IiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2gyY1I5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2gyY2g5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjU3luY01ldGhvZHMiLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9jd2gyY3g5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9jd2gyZEI5MkVkNkk1c3dscnNuMzdnIiB0eXBlPSIzMDAxIj4KLSAgICAgICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjTWFya0dlbmVyYXRlZCIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aDJkUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2N3aWRnQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNFcGlzb2RlRmlsZSIvPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX2N3aWRnUjkyRWQ2STVzd2xyc24zN2ciLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX2pWaDBnQjkyRWQ2STVzd2xyc24zN2ciIHR5cGU9IjMwMDEiPgotICAgICAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9hdXRvTmFtZVJlc29sdXRpb24iLz4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9qVmgwZ1I5MkVkNkk1c3dscnNuMzdnIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVUtZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVS11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVUtLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVV9PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMiI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVV9ldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FVX3V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVV8tdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAzIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWQWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZBdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FVOWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVDbGFzcyIgaHJlZj0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVU5dXVrRWQycGZJbVQxalQ3dlEiIHg9IjcyNSIgeT0iMjkwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkJPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwMSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQi11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDAxIi8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWQ091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDAxIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWQ2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZDdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWQy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZET3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMDIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZEZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkR1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZELXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkVPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAwMyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektBVkVldWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektBVkUtdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektBVkJldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFQ2xhc3MiIGhyZWY9IkNYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZCdXVrRWQycGZJbVQxalQ3dlEiIHg9Ijc1MCIgeT0iNjcwIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkZPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWRi11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA1Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWR091a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDExIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWR2V1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZHdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWRy11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZIT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZIZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkh1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZILXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZGZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIGhyZWY9IkNYRi5lY29yZSMvL0Zyb250ZW5kIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkZ1dWtFZDJwZkltVDFqVDd2USIgeD0iNzM1IiB5PSIxNSIgd2lkdGg9IjkxIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVklPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNSI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSS11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA1Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWSk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDExIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWSmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZKdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWSi11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLQVZLT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTIiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLQVZLZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektBVkt1dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLQVZLLXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLQVZJZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RUVudW0iIGhyZWY9IkNYRi5lY29yZSMvL0RhdGFCaW5kaW5nIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkl1dWtFZDJwZkltVDFqVDd2USIgeD0iNzM1IiB5PSI3NSIgd2lkdGg9IjkxIi8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVkxPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTC11a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0FWTU91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0FWTWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLQVZNdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0FWTS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWTGV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vVVJMIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektBVkx1dWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIxNSIgd2lkdGg9Ijc2Ii8+Ci0gIDwvY2hpbGRyZW4+Ci0gIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektBVk5PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iMjAwNCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGOE91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI1MDA0Ii8+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGOGV1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI3MDEwIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRyYXdlclN0eWxlIiB4bWk6aWQ9Il96S0tGOHV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTb3J0aW5nU3R5bGUiIHhtaTppZD0iX3pLS0Y4LXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbHRlcmluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGOU91a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il96S0FWTmV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgaHJlZj0iQ1hGLmVjb3JlIy8vRGVmaW5pdGlvbiIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLQVZOdXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iNjAiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0Y5ZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjIwMDQiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRi1PdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNTAwNCIvPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfektLRi1ldWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNzAxMCI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEcmF3ZXJTdHlsZSIgeG1pOmlkPSJfektLRi11dWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U29ydGluZ1N0eWxlIiB4bWk6aWQ9Il96S0tGLS11a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWx0ZXJpbmdTdHlsZSIgeG1pOmlkPSJfektLRl9PdWtFZDJwZkltVDFqVDd2USIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfektLRjl1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhtaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIGhyZWY9IkNYRi5lY29yZSMvL01hcCIvPgotICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3pLS0Y5LXVrRWQycGZJbVQxalQ3dlEiIHg9IjE4NSIgeT0iMTEwIiB3aWR0aD0iNzYiLz4KLSAgPC9jaGlsZHJlbj4KLSAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il96S0tGX2V1a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSIyMDA0Ij4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0dBT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjUwMDQiLz4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX3pLS0dBZXVrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjcwMTAiPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RHJhd2VyU3R5bGUiIHhtaTppZD0iX3pLS0dBdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNvcnRpbmdTdHlsZSIgeG1pOmlkPSJfektLR0EtdWtFZDJwZkltVDFqVDd2USIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsdGVyaW5nU3R5bGUiIHhtaTppZD0iX3pLS0dCT3VrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX3pLS0ZfdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4bWk6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBocmVmPSJDWEYuZWNvcmUjLy9JTWV0aG9kIi8+Ci0gICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfektLRl8tdWtFZDJwZkltVDFqVDd2USIgeD0iMTg1IiB5PSIxNTUiIHdpZHRoPSI3NiIvPgotICA8L2NoaWxkcmVuPgotICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtU3R5bGUiIHhtaTppZD0iX3lyVU4wdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgPGVsZW1lbnQgeG1pOnR5cGU9ImVjb3JlOkVQYWNrYWdlIiBocmVmPSJDWEYuZWNvcmUjLyIvPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pVbDBVT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKdGFBT3VrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VWwwVWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VWwwVXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pVbDBVLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWzQsIC0xLCAxLCA3M10kWzQsIC03MywgMSwgMV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUNPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjQ2LDAuMDA3NDkwNjM3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Q2V1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNTAyNzAyNywwLjk4NTIyMTcpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1FPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTEhldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dRZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dRdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1EtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMSwgLTQxLCAzMThdJFs0MSwgLTMxNywgMCwgMF0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUFPdWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjg5OTU4MTYsMC4wNDI3ODA3NSkiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUFldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjEwODEwODExLDAuOTk1MDczOSkiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnUk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96SjNMTGV1a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96SjNMRGV1a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1JldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1J1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnUi11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtNjAsIC0xMjBdJFs2MCwgMTIwLCAwLCAwXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Q3V1a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuOTA4MTYzMjUsMC4wMDUzNDc1OTM3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qy11a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuMjU1LDAuOTg4NzY0MDUpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1NPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfekozTExldWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekozTEhldWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dTZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dTdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1MtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTYwLCA2Ml0kWzYwLCAtNjEsIDAsIDFdIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlET3VrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4zODc3NTUxLDAuMDA1MzQ3NTkzNykiLz4KLSAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOURldWtFZDJwZkltVDFqVDd2USIgaWQ9IigwLjUxMDQ2MDI2LDAuOTg5MzA0ODQpIi8+Ci0gIDwvZWRnZXM+Ci0gIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfelZDZ1RPdWtFZDJwZkltVDFqVDd2USIgdHlwZT0iNDAwNCIgc291cmNlPSJfektBVTlPdWtFZDJwZkltVDFqVDd2USIgdGFyZ2V0PSJfekp0YUFPdWtFZDJwZkltVDFqVDd2USI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX3pWQ2dUZXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX3pWQ2dUdXVrRWQycGZJbVQxalQ3dlEiLz4KLSAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfelZDZ1QtdWtFZDJwZkltVDFqVDd2USIgcG9pbnRzPSJbMCwgMCwgLTYwLCAzMDFdJFs2MCwgLTMwMCwgMCwgMV0iLz4KLSAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfeldYOUJ1dWtFZDJwZkltVDFqVDd2USIgaWQ9IigxLjAsMC40OTg0MTI3KSIvPgotICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qi11a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuODQ4NjQ4NjcsMC45NjU1MTcyKSIvPgotICA8L2VkZ2VzPgotICA8ZWRnZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkVkZ2UiIHhtaTppZD0iX3pWQ2dVT3VrRWQycGZJbVQxalQ3dlEiIHR5cGU9IjQwMDQiIHNvdXJjZT0iX3pLQVZCT3VrRWQycGZJbVQxalQ3dlEiIHRhcmdldD0iX3pKM0xEZXVrRWQycGZJbVQxalQ3dlEiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il96VkNnVWV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il96VkNnVXV1a0VkMnBmSW1UMWpUN3ZRIi8+Ci0gICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3pWQ2dVLXVrRWQycGZJbVQxalQ3dlEiIHBvaW50cz0iWy01NiwgLTMwLCAzNzQsIDIwMl0kWy0yNjUsIC0xNDMsIDE2NSwgODldIi8+Ci0gICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBdXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4wNTUxNzI0MTQsMC4wMDgxMzAwODEpIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlBLXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC4wLDAuNjY2NjY2NykiLz4KLSAgPC9lZGdlcz4KLSAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il96VkNnVk91a0VkMnBmSW1UMWpUN3ZRIiB0eXBlPSI0MDA0IiBzb3VyY2U9Il96S0FWQk91a0VkMnBmSW1UMWpUN3ZRIiB0YXJnZXQ9Il96S0FVOU91a0VkMnBmSW1UMWpUN3ZRIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfelZDZ1ZldWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfelZDZ1Z1dWtFZDJwZkltVDFqVDd2USIvPgotICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il96VkNnVi11a0VkMnBmSW1UMWpUN3ZRIiBwb2ludHM9IlswLCAwLCAtMTExLCAwXSRbMTExLCAwLCAwLCAwXSIvPgotICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il96V1g5Qk91a0VkMnBmSW1UMWpUN3ZRIiBpZD0iKDAuNTg2MjA2OSwwLjApIi8+Ci0gICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX3pXWDlCZXVrRWQycGZJbVQxalQ3dlEiIGlkPSIoMC40MDI5MzA0LDAuOTkzNjUwOCkiLz4KLSAgPC9lZGdlcz4KLTwvbm90YXRpb246RGlhZ3JhbT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5nZW5tb2RlbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL21vZGVsL0NYRi5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkOWQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9tb2RlbC9DWEYuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIGNvcHlyaWdodFRleHQ9IkNvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMmI3hEOyYjeEE7QWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTthcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAmI3hEOyYjeEE7d2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQmI3hEOyYjeEE7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7ICYjeEQ7JiN4QTtDb250cmlidXRvcnM6JiN4RDsmI3hBO0lPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIKLSAgICBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMiIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZSIKLSAgICBtb2RlbE5hbWU9IkNYRiIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9IiIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9IiIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuZWNvcmUiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIgotICAgIGxhbmd1YWdlPSIiPgotICA8Zm9yZWlnbk1vZGVsPkNYRi5lY29yZTwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJDWEYiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9IkNYRi5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iQ1hGLmVjb3JlIy8vRnJvbnRlbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJDWEYuZWNvcmUjLy9Gcm9udGVuZC9KQVhXUyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09IkNYRi5lY29yZSMvL0RhdGFCaW5kaW5nIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iQ1hGLmVjb3JlIy8vRGF0YUJpbmRpbmcvSkFYQiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJDWEYuZWNvcmUjLy9VUkwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL0RlZmluaXRpb24iLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IkNYRi5lY29yZSMvL01hcCI+Ci0gICAgICA8Z2VuVHlwZVBhcmFtZXRlcnMgZWNvcmVUeXBlUGFyYW1ldGVyPSJDWEYuZWNvcmUjLy9NYXAvVCIvPgotICAgICAgPGdlblR5cGVQYXJhbWV0ZXJzIGVjb3JlVHlwZVBhcmFtZXRlcj0iQ1hGLmVjb3JlIy8vTWFwL1QxIi8+Ci0gICAgPC9nZW5EYXRhVHlwZXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJDWEYuZWNvcmUjLy9JTWV0aG9kIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9DWEZDb250ZXh0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvY3hmUnVudGltZUVkaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2N4ZlJ1bnRpbWVWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC92ZXJib3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9nZW5lcmF0ZUFudEJ1aWxkRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZ2VuZXJhdGVDbGllbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L2dlbmVyYXRlU2VydmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9kYXRhYmluZGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZnJvbnRlbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZDb250ZXh0L3VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkNvbnRleHQvZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGQ29udGV4dC9jeGZJbnN0YWxsTG9jYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvcHJvamVjdE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvcmVzb3VyY2VEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY2xhc3NEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbEZpbGVOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL3dzZGxVUkwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvY29uZmlnV3NkbExvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9mdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL2NvbmZpZ0lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vQ1hGRGF0YU1vZGVsL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0NYRkRhdGFNb2RlbC9lbmRwb2ludE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvc2VydmljZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbERlZmluaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9DWEZEYXRhTW9kZWwvd3NkbExvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L3NvYXAxMkJpbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVhTREltcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdTREwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0NvbnRleHQvZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTQ29udGV4dC9nZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NDb250ZXh0L2dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL2NsYXNzcGF0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvamF2YVN0YXJ0aW5nUG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvZXh0cmFjdEludGVyZmFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL0phdmEyV1NEYXRhTW9kZWwvbWV0aG9kTWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9hbm5vdGF0aW9uTWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vSmF2YTJXU0RhdGFNb2RlbC9zb3VyY2VEaXJlY3RvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9KYXZhMldTRGF0YU1vZGVsL3BvcnROYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9nZW5lcmF0ZUltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9wcm9jZXNzU09BUEhlYWRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9sb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQvdmFsaWRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3dzZGxWZXJzaW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC91c2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNBcmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC9ub0FkZHJlc3NCaW5kaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNVc2VEZWZhdWx0VmFsdWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNUb1N0cmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjVG9TdHJpbmdNdWx0aUxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L3hqY1RvU3RyaW5nU2ltcGxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNMb2NhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhQ29udGV4dC94amNTeW5jTWV0aG9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjTWFya0dlbmVyYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YUNvbnRleHQveGpjRXBpc29kZUZpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFDb250ZXh0L2F1dG9OYW1lUmVzb2x1dGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9pbmNsdWRlZE5hbWVzcGFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBDWEYuZWNvcmUjLy9XU0RMMkphdmFEYXRhTW9kZWwvYmluZGluZ0ZpbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgQ1hGLmVjb3JlIy8vV1NETDJKYXZhRGF0YU1vZGVsL2V4Y2x1ZGVkTmFtZXNwYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9jYXRhbG9nRmlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIENYRi5lY29yZSMvL1dTREwySmF2YURhdGFNb2RlbC9qYXZhU291cmNlRm9sZGVyIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMjQzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIENvcmUgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1DWEZfRkFDRVRfQ09SRV9MQUJFTD1DWEYgMi54IFdlYiBTZXJ2aWNlcwotQ1hGX0ZBQ0VUX0NPUkVfRElTQ1JJUFRJT049RW5hYmxlcyBXZWIgU2VydmljZXMgZ2VuZXJhdGlvbiB0aHJvdWdoIENYRiAyLngKLUNYRl9DT1JFX1RFTVBMQVRFX0xBQkVMPUNYRiBXZWIgU2VydmljZXMgUHJvamVjdAotQ1hGX0ZBQ0VUX0pTVF9XRUIyNF9QUkVTRVRfTEFCRUw9Q1hGIFdlYiBTZXJ2aWNlcyBQcm9qZWN0IHYyLjQKLUNYRl9GQUNFVF9KU1RfV0VCMjVfUFJFU0VUX0xBQkVMPUNYRiBXZWIgU2VydmljZXMgUHJvamVjdCB2Mi41Ci1DWEZfRkFDRVRfSlNUX1dFQjI0X1BSRVNFVF9ERVNDUklQVElPTj1Db25maWd1cmVzIGEgRHluYW1pYyBXZWIgUHJvamVjdCB3aXRoIENYRiB1c2luZyBXZWIgTW9kdWxlIHYyLjQgYW5kIEphdmEgdjUuMAotQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfREVTQ1JJUFRJT049Q29uZmlndXJlcyBhIER5bmFtaWMgV2ViIFByb2plY3Qgd2l0aCBDWEYgdXNpbmcgV2ViIE1vZHVsZSB2Mi41IGFuZCBKYXZhIHY1LjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmUxODI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICAgPHBhY2thZ2UgCi0gICAgICAgICAgdXJpID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIiAKLSAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSIKLSAgICAgICAgICBnZW5Nb2RlbCA9ICJtb2RlbC9DWEYuZ2VubW9kZWwiIC8+IAotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0gICAgICAgPHByb2plY3QtZmFjZXQgaWQ9ImN4Zi5jb3JlIj4KLSAgICAgICAgICA8bGFiZWw+JUNYRl9GQUNFVF9DT1JFX0xBQkVMPC9sYWJlbD4KLQkgICAgICA8ZGVzY3JpcHRpb24+JUNYRl9GQUNFVF9DT1JFX0RJU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkgICA8L3Byb2plY3QtZmFjZXQ+Ci0gICAgICAgCi0JICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0iY3hmLmNvcmUiIHZlcnNpb249IjEuMCI+Ci0JICAgICAgPGNvbnN0cmFpbnQ+Ci0JCSAgICAgPGFuZD4KLSAgICAgIAkgICAgICAgIDxyZXF1aXJlcyBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuNSIvPgotICAgICAgCSAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzUuMCIvPgotICAgICAgICAgICAgICAgIDxjb25mbGljdHMgZmFjZXQ9ImF4aXMyLmNvcmUiIHZlcnNpb249IlsxLjAiLz4KLSAgICAgICAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJheGlzMi5leHQiIHZlcnNpb249IlsxLjAiLz4KLSAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPGFjdGlvbiBpZD0iY3hmLmNvcmUuaW5zdGFsbCIgdHlwZT0iSU5TVEFMTCI+Ci0gICAgICAJICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQuQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgICAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQuQ1hGRmFjZXRJbnN0YWxsQWN0aW9uQ29uZmlnRmFjdG9yeSIvPgotICAgIAkgIDwvYWN0aW9uPgotICAgICAgICAgIAotICAgICAgICAgIDxhY3Rpb24gaWQ9ImN4Zi5jb3JlLnVuaW5zdGFsbCIgdHlwZT0iVU5JTlNUQUxMIj4KLSAgICAgICAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQuQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgICAgIDwvYWN0aW9uPgotICAJICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5jeGYuY29yZSI+Ci0gICAgICAgICAgPGxhYmVsPiVDWEZfQ09SRV9URU1QTEFURV9MQUJFTDwvbGFiZWw+Ci0gICAgICAgICAgPGZpeGVkCi0gICAgICAgICAgICAgICBmYWNldD0iY3hmLmNvcmUiPgotICAgICAgICAgIDwvZml4ZWQ+Ci0gICAgICAgICAgPGZpeGVkCi0gICAgICAgICAgICAgICBmYWNldD0ianN0LndlYiI+Ci0gICAgICAgICAgPC9maXhlZD4KLSAgICAgICAgICA8Zml4ZWQKLSAgICAgICAgICAgICAgIGZhY2V0PSJqc3QuamF2YSI+Ci0gICAgICAgICAgPC9maXhlZD4KLSAgICAgICAgICA8cHJlc2V0Ci0gICAgICAgICAgICAgaWQ9ImN4Zi5qc3Qud2ViMjUucHJlc2V0Ij4KLSAgICAgICAgICA8L3ByZXNldD4KLSAgICAgICA8L3RlbXBsYXRlPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLSAgICAgICA8c3VwcG9ydGVkPgotICAgICAgICAgIDxydW50aW1lLWNvbXBvbmVudCBhbnk9InRydWUiLz4KLSAgICAgICAgICA8ZmFjZXQKLSAgICAgICAgICAgICBpZD0iY3hmLmNvcmUiCi0gICAgICAgICAgICAgdmVyc2lvbj0iMS4wIi8+Ci0gICAgICAgPC9zdXBwb3J0ZWQ+Ci0gICAgPC9leHRlbnNpb24+Ci0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcmVzZXRzIj4KLSAgICAgICA8c3RhdGljLXByZXNldCBpZD0iY3hmLmpzdC53ZWIyNS5wcmVzZXQiPgotICAgICAgICAgIDxsYWJlbD4lQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfTEFCRUw8L2xhYmVsPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4lQ1hGX0ZBQ0VUX0pTVF9XRUIyNV9QUkVTRVRfREVTQ1JJUFRJT048L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJjeGYuY29yZSIKLSAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgotICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgaWQ9ImpzdC53ZWIiCi0gICAgICAgICAgICAgdmVyc2lvbj0iMi41Ij4KLSAgICAgICAgICA8L2ZhY2V0PgotICAgICAgICAgIDxmYWNldAotICAgICAgICAgICAgIGlkPSJqc3QuamF2YSIKLSAgICAgICAgICAgICB2ZXJzaW9uPSI1LjAiPgotICAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgPC9zdGF0aWMtcHJlc2V0PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIj4KLSAgICAgICA8Y2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiPgotICAgICAgIDwvY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI+Ci0gICAgPC9leHRlbnNpb24+ICAgIAotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4Yzg0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLQotcHVibGljIGNsYXNzIENYRkNsYXNzcGF0aENvbnRhaW5lciBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXIgewotCi0gICAgcHJpdmF0ZSBJUGF0aCBwYXRoOwotICAgIHByaXZhdGUgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGNsYXNzcGF0aEVudHJpZXM7Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgU3RyaW5nIGluc3RhbGxlZDsKLQotICAgIHB1YmxpYyBDWEZDbGFzc3BhdGhDb250YWluZXIoSVBhdGggcGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLSAgICAgICAgY2xhc3NwYXRoRW50cmllcyA9ICBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpIHsKLSAgICAgICAgaWYgKCFpbnN0YWxsZWQuZXF1YWxzKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QpKSkgewotICAgICAgICAgICAgY2xhc3NwYXRoRW50cmllcy5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIEZpbGUgY3hmTGliRGlyZWN0b3J5ID0gZ2V0Q1hGTGlicmFyeURpcmVjdG9yeSgpOwotICAgICAgICAgICAgaWYgKGN4ZkxpYkRpcmVjdG9yeS5leGlzdHMoKSAmJiBjeGZMaWJEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gY3hmTGliRGlyZWN0b3J5Lmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN4ZkxpYkRpcmVjdG9yeS5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZS5pbmRleE9mKCIuIikgIT0gLTEgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpLCBmaWxlTmFtZS5sZW5ndGgoKSkuZXF1YWxzKCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhFbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKCIvIikpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjbGFzc3BhdGhFbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtjbGFzc3BhdGhFbnRyaWVzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGlmIChnZXRDeGZSdW50aW1lTG9jYXRpb24oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIEZpbGUgY3hmTGliRGlyZWN0b3J5ID0gZ2V0Q1hGTGlicmFyeURpcmVjdG9yeSgpOwotICAgICAgICAgICAgcmV0dXJuIGN4ZkxpYkRpcmVjdG9yeS5leGlzdHMoKSAmJiBjeGZMaWJEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuICBNZXNzYWdlRm9ybWF0LmZvcm1hdChDWEZDb3JlTWVzc2FnZXMuQ1hGX0NPTlRBSU5FUl9MSUJSQVJZLCBnZXRDeGZSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgIGdldEN4ZlJ1bnRpbWVWZXJzaW9uKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLSAgICAgICAgcmV0dXJuIEtfQVBQTElDQVRJT047Ci0gICAgfQotCi0gICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBwYXRoOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBnZXRDeGZJbnN0YWxsKCkgewotICAgICAgICBTdHJpbmcgaW5zdGFsbGVkID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCk7Ci0gICAgICAgIHRoaXMuaW5zdGFsbGVkID0gaW5zdGFsbGVkOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS5nZXQoaW5zdGFsbGVkKTsKLSAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3hmUnVudGltZUxvY2F0aW9uKCkgewotICAgICAgICBDWEZJbnN0YWxsIGN4Zkluc3RhbGwgPSBnZXRDeGZJbnN0YWxsKCk7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldExvY2F0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3hmUnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IGdldEN4Zkluc3RhbGwoKTsKLSAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q3hmUnVudGltZVR5cGUoKSB7Ci0gICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IGdldEN4Zkluc3RhbGwoKTsKLSAgICAgICAgaWYgKGN4Zkluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIGdldENYRkxpYnJhcnlEaXJlY3RvcnkoKSB7Ci0gICAgICAgIElQYXRoIGN4ZkxpYlBhdGggPSBuZXcgUGF0aChnZXRDeGZSdW50aW1lTG9jYXRpb24oKSk7Ci0gICAgICAgIGlmICghY3hmTGliUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBGaWxlIGN4ZkxpYkRpcmVjdG9yeSA9IG5ldyBGaWxlKGN4ZkxpYlBhdGgudG9PU1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGN4ZkxpYkRpcmVjdG9yeTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTk0NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgZXh0ZW5kcyBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDWEZDbGFzc3BhdGhDb250YWluZXIgY3hmQ2xhc3NwYXRoQ29udGFpbmVyID0gbmV3IENYRkNsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCk7Ci0KLSAgICAgICAgaWYgKGN4ZkNsYXNzcGF0aENvbnRhaW5lci5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIEphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAotICAgICAgICAgICAgICAgICAgICBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgY3hmQ2xhc3NwYXRoQ29udGFpbmVyIH0sIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAotICAgICAgICAgICAgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXJTdWdnZXN0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10ge2phdmFQcm9qZWN0fSwKLSAgICAgICAgICAgICAgICBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgY29udGFpbmVyU3VnZ2VzdGlvbiB9LCBudWxsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzY1OTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfRkFDRVRfSU5TVEFMTF9ERUxFR0FURV9SVU5USU1FX0xPQ0FUSU9OX05PVF9TRVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfQ09OVEFJTkVSX0xJQlJBUlk7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1hGQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL0NYRkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWRhYTc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0pEVFV0aWxzCi1DWEZfRkFDRVRfSU5TVEFMTF9ERUxFR0FURV9SVU5USU1FX0xPQ0FUSU9OX05PVF9TRVQ9Q1hGIFJ1bnRpbWUgbG9jYXRpb24gbm90IHNldC4gUGxlYXNlIHNldCBsb2NhdGlvbiBpbiBQcmVmZXJlbmNlcyA+IFdlYiBTZXJ2aWNlcyA+IENYZiAyLnggUHJlZmVyZW5jZXMKLUNYRl9DT05UQUlORVJfTElCUkFSWT17MH0gTGlicmFyeSBbezF9XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvQ1hGQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzFlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9DWEZDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LldTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDb3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvL0NYRiBDbGFzc3BhdGggY29udGFpbmVyIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1ZFUlNJT05fMl8wID0gIjIuMCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9WRVJTSU9OXzJfMSA9ICIyLjEiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ29yZVBsdWdpbiBwbHVnaW47Ci0KLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBqYXZhMldTQ29udGV4dDsKLSAgICBwcml2YXRlIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IHdzZGwySmF2YUNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIFZlcnNpb24gY3VycmVudFJ1bnRpbWVWZXJzaW9uOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNvcmVQbHVnaW4oKSB7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKLSAgICAgICAgcGx1Z2luID0gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgZ2V0SmF2YTJXU0NvbnRleHQoKSB7Ci0gICAgICAgIGlmIChqYXZhMldTQ29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBqYXZhMldTQ29udGV4dCA9IG5ldyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQoKTsKLSAgICAgICAgICAgIGphdmEyV1NDb250ZXh0LmxvYWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gamF2YTJXU0NvbnRleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IGdldFdTREwySmF2YUNvbnRleHQoKSB7Ci0gICAgICAgIGlmICh3c2RsMkphdmFDb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHdzZGwySmF2YUNvbnRleHQgPSBuZXcgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQoKTsKLSAgICAgICAgICAgIHdzZGwySmF2YUNvbnRleHQubG9hZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFDb250ZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBWZXJzaW9uIGdldEN1cnJlbnRSdW50aW1lVmVyc2lvbigpIHsKLSAgICAgICAgLy9pZiAoY3VycmVudFJ1bnRpbWVWZXJzaW9uID09IG51bGwpIHsKLSAgICAgICAgU3RyaW5nIGN4ZlJ1bnRpbWVWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLSAgICAgICAgaWYgKGN4ZlJ1bnRpbWVWZXJzaW9uLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIGN4ZlJ1bnRpbWVWZXJzaW9uID0gIjAuMC4wIjsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmN1cnJlbnRSdW50aW1lVmVyc2lvbiA9IG5ldyBWZXJzaW9uKGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgLy99Ci0gICAgICAgIHJldHVybiBjdXJyZW50UnVudGltZVZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFJ1bnRpbWVWZXJzaW9uKFZlcnNpb24gdmVyc2lvbikgewotICAgICAgICB0aGlzLmN1cnJlbnRSdW50aW1lVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q1hGUnVudGltZVZlcnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGN4ZlJ1bnRpbWVWZXJzaW9uKSB7Ci0gICAgICAgIElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0gICAgICAgIHByZWZzLnB1dChQTFVHSU5fSUQgKyAiLnJ1bnRpbWUudmVyc2lvbiIsIGN4ZlJ1bnRpbWVWZXJzaW9uKTsKLSAgICAgICAgZmx1c2gocHJlZnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q1hGUnVudGltZVZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotICAgICAgICByZXR1cm4gcHJlZnMuZ2V0KFBMVUdJTl9JRCArICIucnVudGltZS52ZXJzaW9uIiwKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZsdXNoKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByZWZzLmZsdXNoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKLSAgICAgICAgICAgIGxvZyhic2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBDWEYgcHJlZmVyZW5jZXMgZm9yIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICBleGNlcHRpb24udG9TdHJpbmcoKSwgZXhjZXB0aW9uKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0NYRlBlcnNpc3RlbnRDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvQ1hGUGVyc2lzdGVudENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwOTI4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvQ1hGUGVyc2lzdGVudENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29udGV4dC5QZXJzaXN0ZW50Q29udGV4dDsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDWEZQZXJzaXN0ZW50Q29udGV4dCBleHRlbmRzIFBlcnNpc3RlbnRDb250ZXh0IGltcGxlbWVudHMgQ1hGQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBDWEYgcnVudGltZSBsb2NhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9ICJkZWZhdWx0UnVudGltZUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBDWEYgcnVudGltZSB0eXBlIGdlbmVyYWwgcHJlZmVyZW5jZSBmcm9tCi0gICAgICogdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1RZUEUgPSAiZGVmYXVsdFJ1bnRpbWVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBDWEYgdmVyc2lvbiBnZW5lcmFsIHByZWZlcmVuY2UgZnJvbQotICAgICAqIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gImRlZmF1bHRSdW50aW1lVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1ZFUlNJT05TID0gImN4ZlJ1bnRpbWVWZXJzaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9MT0NBVElPTlMgPSAiY3hmUnVudGltZUxvY2F0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9UWVBFUyA9ICJjeGZSdW50aW1lVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSAiZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfQ1hGX1ZFUkJPU0UgPSAiY3hmVmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhUID0gImN4ZlVzZVNwcmluZ0FwcENvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgQ1hGUGVyc2lzdGVudENvbnRleHQoUGx1Z2luIHBsdWdpbikgewotICAgICAgICBzdXBlcihDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbG9hZCgpIHsKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVFlQRSwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiwgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1ZFUlNJT05TLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0NYRl9SVU5USU1FX0xPQ0FUSU9OUywgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9UWVBFUywgIiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DWEZfVkVSQk9TRSwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVkVSQk9TRSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9DWEZfVVNFX1NQUklOR19BUFBfQ09OVEVYVCwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBnZXRJbnN0YWxsYXRpb25zKCkgewotICAgICAgICBpZiAoaW5zdGFsbGF0aW9ucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsYXRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPigpOwotICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25zID0gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1ZFUlNJT05TKS50cmltKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jdGlvbnMgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfTE9DQVRJT05TKS50cmltKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdHlwZXMgPSBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfQ1hGX1JVTlRJTUVfVFlQRVMpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9ucy50cmltKCkubGVuZ3RoKCkgPiAwICYmIGxvY3Rpb25zLnRyaW0oKS5sZW5ndGgoKSA+IDAgJiYgdHlwZXMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGN4ZlZlcnNpb25zID0gdmVyc2lvbnMuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjeGZMb2NhdGlvbnMgPSBsb2N0aW9ucy5zcGxpdCgiLCIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGN4ZlR5cGVzID0gdHlwZXMuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN4ZlZlcnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IENYRkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNYRkluc3RhbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbC5zZXRWZXJzaW9uKGN4ZlZlcnNpb25zW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbC5zZXRMb2NhdGlvbihjeGZMb2NhdGlvbnNbaV0pOwotICAgICAgICAgICAgICAgICAgICBjeGZJbnN0YWxsLnNldFR5cGUoY3hmVHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zLnB1dChjeGZWZXJzaW9uc1tpXSwgY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnN0YWxsYXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluc3RhbGxhdGlvbnMoTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbGF0aW9ucykgewotICAgICAgICB0aGlzLmluc3RhbGxhdGlvbnMgPSBpbnN0YWxsYXRpb25zOwotCi0gICAgICAgIENvbGxlY3Rpb248Q1hGSW5zdGFsbD4gaW5zdGFsbHMgPSBpbnN0YWxsYXRpb25zLnZhbHVlcygpOwotCi0gICAgICAgIFN0cmluZ0J1aWxkZXIgdmVyc2lvbnMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGxvY2F0aW9ucyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgdHlwZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBJdGVyYXRvcjxDWEZJbnN0YWxsPiBpbnN0YWxsSXRlciA9IGluc3RhbGxzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpbnN0YWxsSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IGluc3RhbGxJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZChjeGZJbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICBsb2NhdGlvbnMuYXBwZW5kKGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB0eXBlcy5hcHBlbmQoY3hmSW5zdGFsbC5nZXRUeXBlKCkpOwotICAgICAgICAgICAgaWYgKGluc3RhbGxJdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgICAgIGxvY2F0aW9ucy5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NYRl9SVU5USU1FX1ZFUlNJT05TLCB2ZXJzaW9ucy50b1N0cmluZygpKTsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9MT0NBVElPTlMsIGxvY2F0aW9ucy50b1N0cmluZygpKTsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9DWEZfUlVOVElNRV9UWVBFUywgdHlwZXMudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgcnVudGltZUxvY2F0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OLCBydW50aW1lTG9jYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9UWVBFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZVR5cGUoU3RyaW5nIHJ1bnRpbWVFZGl0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfREVGQVVMVF9SVU5USU1FX1RZUEUsIHJ1bnRpbWVFZGl0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKFN0cmluZyBydW50aW1lVmVyc2lvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OLCBydW50aW1lVmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGJvb2xlYW4gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSLCBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfQ1hGX1ZFUkJPU0UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfQ1hGX1ZFUkJPU0UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9DWEZfVVNFX1NQUklOR19BUFBfQ09OVEVYVCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGJvb2xlYW4gdXNlU3ByaW5nQXBwQ29udGV4dCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0NYRl9VU0VfU1BSSU5HX0FQUF9DT05URVhULCB1c2VTcHJpbmdBcHBDb250ZXh0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2NvbnRleHQvSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjA5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L0phdmEyV1NQZXJzaXN0ZW50Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGV4dGVuZHMgQ1hGUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBKYXZhMldTQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgc29hcCBiaW5kaW5nIGdlbmVyYWwgcHJlZmVyZW5jZQotICAgICAqIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19TT0FQMTJfQklORElORyA9ICJjeGZKMldTU29hcDEyQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSB4c2QgaW1wb3J0cyBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMgPSAiY3hmSjJXU1hTREltcG9ydHMiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBkZWZhdWx0IGZyb250ZW5kIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfRlJPTlRFTkQgPSAiY3hmSjJXU0RlZmF1bHRGcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGRlZmF1bHQgRGF0YWJpbmRpbmcgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9EQVRBQklORElORyA9ICJjeGZKMldTRGVmYXVsdERhdGFiaW5kaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgY2xpZW50IGdlbmVyYWwgcHJlZmVyZW5jZQotICAgICAqIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0NMSUVOVCA9ICJjeGZKMldTR2VuZXJhdGVDbGllbnQiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSBzZXJ2ZXIgZ2VuZXJhbCBwcmVmZXJlbmNlCi0gICAgICogZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfU0VSVkVSID0gImN4ZkoyV1NHZW5lcmF0ZVNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgY3hmIGdlbmVyYXRlIHdyYXBwZXIgYW5kIGZhdWx0IGJlYW5zCi0gICAgICogZ2VuZXJhbCBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMgPSAiY3hmSjJXU0dlbmVyYXRlV3JhcHBlckZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGNvbnN0YW50IHVzZWQgdG8gbG9va3VwIHRoZSBjeGYgZ2VuZXJhdGUgd3NkbCBnZW5lcmFsIHByZWZlcmVuY2UKLSAgICAgKiBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XU0RMID0gImN4ZkoyV1NHZW5lcmF0ZVdTREwiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIGN4ZiBnZW5lcmF0ZSBhbnQgYnVpbGQgZmlsZSBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9ICJjeGZKMldTR2VuZXJhdGVBTlRCdWlsZEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcgY29uc3RhbnQgdXNlZCB0byBsb29rdXAgdGhlIEFQVCBhbm5vdGF0aW9uIHByb2Nlc3NpbmcgZ2VuZXJhbAotICAgICAqIHByZWZlcmVuY2UgZnJvbSB0aGUgcGx1Z2lucyBsb2NhbCBwcmVmZXJlbmNlcyBzdG9yZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0oyV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lORwotICAgID0gImN4ZkoyV1NFbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgZ2VuZXJhdGUgPGNvZGU+QFdlYk1ldGhvZDwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OCi0gICAgPSAiY3hmSjJXU0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgZ2VuZXJhdGUgPGNvZGU+QFdlYlBhcmFtPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTgotICAgID0gImN4ZkoyV1NHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgZ2VuZXJhdGUgPGNvZGU+QFJlcXVlc3RXcmFwcGVyPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYWwKLSAgICAgKiBwcmVmZXJlbmNlIGZyb20gdGhlIHBsdWdpbnMgbG9jYWwgcHJlZmVyZW5jZXMgc3RvcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTgotICAgID0gImN4ZkoyV1NHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBjb25zdGFudCB1c2VkIHRvIGxvb2t1cCB0aGUgZ2VuZXJhdGUgPGNvZGU+QFJlc3BvbnNlV3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmFsCi0gICAgICogcHJlZmVyZW5jZSBmcm9tIHRoZSBwbHVnaW5zIGxvY2FsIHByZWZlcmVuY2VzIHN0b3JlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OCi0gICAgPSAiY3hmSjJXU0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBKYXZhMldTUGVyc2lzdGVudENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBzdXBlci5sb2FkKCk7Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9KMldTX1NPQVAxMl9CSU5ESU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19ERUZBVUxUX0RBVEFCSU5ESU5HLCBEYXRhQmluZGluZy5KQVhCLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCwgRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9XU0RMLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfSjJXU19FTkFCTEVfQU5OT1RBVElPTl9QUk9DRVNTSU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEKSk7Ci0KLSAgICAgICAgLy9UT0RPIE1PVkUgVEhFIEZPTExPV0lORyA0Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OLCBDWEZNb2RlbFV0aWxzCi0gICAgICAgICAgICAgICAgLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04sIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NvYXAxMkJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfU09BUDEyX0JJTkRJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNvYXAxMkJpbmRpbmcoYm9vbGVhbiBzb2FwMTJCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19TT0FQMTJfQklORElORywgc29hcDEyQmluZGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVhTREltcG9ydHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlWFNESW1wb3J0cyhib29sZWFuIGdlbmVyYXRlWFNESW1wb3J0cykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfWFNEX0lNUE9SVFMsIGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIERhdGFCaW5kaW5nIGdldERhdGFiaW5kaW5nKCkgewotICAgICAgICByZXR1cm4gRGF0YUJpbmRpbmcuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9KMldTX0RFRkFVTFRfREFUQUJJTkRJTkcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZyhEYXRhQmluZGluZyBkYXRhQmluZGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9EQVRBQklORElORywgZGF0YUJpbmRpbmcuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBGcm9udGVuZC5nZXQoZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIGRlZmF1bHRGcm9udGVuZCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfREVGQVVMVF9GUk9OVEVORCwgZGVmYXVsdEZyb250ZW5kLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9DTElFTlQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gZ2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0NMSUVOVCwgZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfU0VSVkVSKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9TRVJWRVIsIGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhib29sZWFuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMsIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXU0RMKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX1dTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChib29sZWFuIGdlbmVyYXRlV1NETCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0oyV1NfR0VORVJBVEVfV1NETCwgZ2VuZXJhdGVXU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIGdlbmVyYXRlQW50QnVpbGRGaWxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfSjJXU19HRU5FUkFURV9BTlRfQlVJTERfRklMRSwgZ2VuZXJhdGVBbnRCdWlsZEZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9KMldTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbihib29sZWFuIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04sIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oYm9vbGVhbiBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04sIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGJvb2xlYW4gZW5hYmxlQW5ub3RhdGlvblByb2Nlc3NpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9KMldTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcsIGVuYWJsZUFubm90YXRpb25Qcm9jZXNzaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oYm9vbGVhbiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OLCBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OLCBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvY29udGV4dC9XU0RMMkphdmFQZXJzaXN0ZW50Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L1dTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MmQzZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9jb250ZXh0L1dTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YVBlcnNpc3RlbnRDb250ZXh0IGV4dGVuZHMgQ1hGUGVyc2lzdGVudENvbnRleHQgaW1wbGVtZW50cyBXU0RMMkphdmFDb250ZXh0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9DTElFTlQgPSAiY3hmVzJKR2VuZXJhdGVDbGllbnQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfU0VSVkVSID0gImN4ZlcySkdlbmVyYXRlU2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OID0gImN4ZlcySkdlbmVyYXRlSW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSAiY3hmVzJKR2VuZXJhdGVBbnRCdWlsZEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9QUk9DRVNTX1NPQVBfSEVBREVSUyA9ICJjeGZXMkpQcm9jZXNzU09BUEhlYWRlcnMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HIAotICAgICAgICA9ICJjeGZXMkpMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VuYW1lTWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcgCi0gICAgICAgID0gImN4ZlcySkxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCA9ICJjeGZXMkpWYWxpZGF0ZVdTREwiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9EQVRBQklORElORyA9ICJjeGZXMkpEYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9GUk9OVEVORCA9ICJjeGZXMkpGcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04gPSAiY3hmVzJKV1NETFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MgPSAiY3hmVzJKWEpDQXJncyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcgPSAiY3hmVzJKTm9BZGRyZXNzQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMgPSAiY3hmVzJKVXNlRGVmYXVsdFZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiA9ICJjeGZXMkpBdXRvTmFtZVJlc29sdXRpb24iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTID0gInhqY1VzZURlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RPX1NUUklORyA9ICJ4amNUb1N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVE9fU1RSSU5HX01VTFRJID0gInhqY1RvU3RyaW5nTXVsdGkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RPX1NUUklOR19TSU1QTEUgPSAieGpjVG9TdHJpbmdTaW1wbGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX0xPQ0FUT1IgPSAieGpjTG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTID0gInhqY1N5bmNNZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19NQVJLX0dFTkVSQVRFRCA9ICJ4amNNYXJrR2VuZXJhdGVkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEUgPSAieGpjRXBpc29kZUZpbGUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQoKSB7Ci0gICAgICAgIHN1cGVyKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBzdXBlci5sb2FkKCk7Ci0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5ULCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTikpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfWEpDX0FSR1MsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VOQU1FX01BUFBJTkcsIENYRk1vZGVsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcsIENYRk1vZGVsVXRpbHMKLSAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9EQVRBQklORElORywgRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQsIEZyb250ZW5kLkpBWFdTLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04sIENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKQotICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWVMaXRlcmFsKCkpOwotCi0gICAgICAgIHNldERlZmF1bHQoUFJFRkVSRU5DRV9XMkpfTk9fQUREUkVTU19CSU5ESU5HLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT04pKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19VU0VfREVGQVVMVF9WQUxVRVMsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19UT19TVFJJTkcsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1RPX1NUUklOR19NVUxUSSwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLQotICAgICAgICBzZXREZWZhdWx0KFhKQ19UT19TVFJJTkdfU0lNUExFLCBDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfTE9DQVRPUiwgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUikpOwotCi0gICAgICAgIHNldERlZmF1bHQoWEpDX1NZTkNfTUVUSE9EUywgQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfTUFSS19HRU5FUkFURUQsIENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEKSk7Ci0KLSAgICAgICAgc2V0RGVmYXVsdChYSkNfRVBJU09ERV9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGJvb2xlYW4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUsIGdlbmVyYXRlQW50QnVpbGRGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfR0VORVJBVEVfQ0xJRU5UKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChib29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0NMSUVOVCwgZ2VuZXJhdGVDbGllbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9JTVBMRU1FTlRBVElPTiwgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVNlcnZlcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0dFTkVSQVRFX1NFUlZFUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiBnZW5lcmF0ZVNlcnZlcikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9HRU5FUkFURV9TRVJWRVIsIGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFTkFNRV9NQVBQSU5HKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhib29sZWFuIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRU5BTUVfTUFQUElORywKLSAgICAgICAgICAgICAgICBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkcsIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX1BST0NFU1NfU09BUF9IRUFERVJTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU29hcEhlYWRlcnMpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfUFJPQ0VTU19TT0FQX0hFQURFUlMsIHByb2Nlc3NTb2FwSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFBSRUZFUkVOQ0VfVzJKX1ZBTElEQVRFX1dTREwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGJvb2xlYW4gdmFsaWRhdGUpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfVkFMSURBVEVfV1NETCwgdmFsaWRhdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIERhdGFCaW5kaW5nLmdldChnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX0RBVEFCSU5ESU5HKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgZGF0YUJpbmRpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoUFJFRkVSRU5DRV9XMkpfREFUQUJJTkRJTkcsIGRhdGFCaW5kaW5nLmdldExpdGVyYWwoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEZyb250ZW5kIGdldEZyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gRnJvbnRlbmQuZ2V0KGdldFZhbHVlQXNTdHJpbmcoUFJFRkVSRU5DRV9XMkpfRlJPTlRFTkQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGcm9udGVuZChGcm9udGVuZCBmcm9udGVuZCkgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9GUk9OVEVORCwgZnJvbnRlbmQuZ2V0TGl0ZXJhbCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc1N0cmluZyhQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxWZXJzaW9uKFN0cmluZyB3c2RsVmVyc2lvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9XU0RMX1ZFUlNJT04sIHdzZGxWZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhqY0FyZ3MoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzU3RyaW5nKFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNBcmdzKFN0cmluZyB4amNBcmdzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1hKQ19BUkdTLCB4amNBcmdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05vQWRkcmVzc0JpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9OT19BRERSRVNTX0JJTkRJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5vQWRkcmVzc0JpbmRpbmcoYm9vbGVhbiBub0FkZHJlc3NCaW5kaW5nKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX05PX0FERFJFU1NfQklORElORywgbm9BZGRyZXNzQmluZGluZyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oUFJFRkVSRU5DRV9XMkpfQVVUT19OQU1FX1JFU09MVVRJT04pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEF1dG9OYW1lUmVzb2x1dGlvbihib29sZWFuIGF1dG9OYW1lUmVzb2x1dGlvbikgewotICAgICAgICBzZXRWYWx1ZShQUkVGRVJFTkNFX1cySl9BVVRPX05BTUVfUkVTT0xVVElPTiwgYXV0b05hbWVSZXNvbHV0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihQUkVGRVJFTkNFX1cySl9VU0VfREVGQVVMVF9WQUxVRVMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB1c2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIHNldFZhbHVlKFBSRUZFUkVOQ0VfVzJKX1VTRV9ERUZBVUxUX1ZBTFVFUywgdXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZVhKQ0RlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUywgdXNlWEpDRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNCb29sZWFuKFhKQ19UT19TVFJJTkcpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4geGpjVG9TdHJpbmcpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1RPX1NUUklORywgeGpjVG9TdHJpbmcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfVE9fU1RSSU5HX01VTFRJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIHhqY1RvU3RyaW5nTXVsdGlMaW5lKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19UT19TVFJJTkdfTVVMVEksIHhqY1RvU3RyaW5nTXVsdGlMaW5lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1RvU3RyaW5nU2ltcGxlKCkgewotICAgICAgICByZXR1cm4gZ2V0VmFsdWVBc0Jvb2xlYW4oWEpDX1RPX1NUUklOR19TSU1QTEUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4geGpjVG9TdHJpbmdTaW1wbGUpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX1RPX1NUUklOR19TSU1QTEUsIHhqY1RvU3RyaW5nU2ltcGxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY0xvY2F0b3IoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfTE9DQVRPUik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgc2V0VmFsdWUoWEpDX0xPQ0FUT1IsIHhqY0xvY2F0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjU3luY01ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfU1lOQ19NRVRIT0RTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19TWU5DX01FVEhPRFMsIHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY01hcmtHZW5lcmF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRWYWx1ZUFzQm9vbGVhbihYSkNfTUFSS19HRU5FUkFURUQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiB4amNNYXJrR2VuZXJhdGVkKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19NQVJLX0dFTkVSQVRFRCwgeGpjTWFya0dlbmVyYXRlZCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNFcGlzb2RlRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFZhbHVlQXNTdHJpbmcoWEpDX0VQSVNPREVfRklMRSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjRXBpc29kZUZpbGUoU3RyaW5nIHhqY0VwaXNvZGVGaWxlKSB7Ci0gICAgICAgIHNldFZhbHVlKFhKQ19FUElTT0RFX0ZJTEUsIHhqY0VwaXNvZGVGaWxlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9CaW5kaW5nc1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvQmluZGluZ3NUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYwMDVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvZW52L2FudC9CaW5kaW5nc1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nc1RyYW5zZm9ybWVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXIgewotCi0gICAgcHVibGljIE9iamVjdCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ1tdIGFic29sdXRlUGF0aHMgPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCIsIik7Ci0gICAgICAgIGZvciAoU3RyaW5nIGFic291bHV0ZVBhdGggOiBhYnNvbHV0ZVBhdGhzKSB7Ci0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoYWJzb3VsdXRlUGF0aCk7Ci0gICAgICAgICAgICBpZiAocGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiBwYXRoLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoInhtbCIpKSB7Ci0gICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5hZGQoYWJzb3VsdXRlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlc0xpc3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvTWFwcGluZ3NUcmFuc2Zvcm1lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9lbnYvYW50L01hcHBpbmdzVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZjJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL2Vudi9hbnQvTWFwcGluZ3NUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLlRyYW5zZm9ybWVyOwotCi1wdWJsaWMgY2xhc3MgTWFwcGluZ3NUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyIHsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3QgdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpdmFsdWUpOwotICAgICAgICBJRmlsZSByZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChyZXNvdXJjZS5nZXRDb250ZW50cygpKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0QWxsKHByb3BzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFwOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3ZTEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGQ29udGV4dCB7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgQ1hGIEhvbWUgRGlyZWN0b3J5IGxvY2F0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IENYRiBydW50aW1lIGxvY2F0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqICBSZXR1cm5zIHRoZSBkZWZhdWx0IENYRiBydW50aW1lIHR5cGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI3NldERlZmF1bHRSdW50aW1lVHlwZShTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVHlwZSgpCi0gICAgICogQG1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVHlwZSA8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgQ1hGIHJ1bnRpbWUgdHlwZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXREZWZhdWx0UnVudGltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiAgUmV0dXJucyB0aGUgZGVmYXVsdCBDWEYgcnVudGltZSB2ZXJzaW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXREZWZhdWx0UnVudGltZVZlcnNpb24oU3RyaW5nKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2UjZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVZlcnNpb24oKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVZlcnNpb24gPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IENYRiBydW50aW1lIHZlcnNpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgY29tbWVudHMgYXJlIHNob3duIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHByb2Nlc3MuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1ZlcmJvc2UoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVmVyYm9zZSA8ZW0+VmVyYm9zZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRGlzcGxheXMgY29tbWVudHMgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJib3NlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXQgdG8gZ2VuZXJhdGUgYW4gQW50IGJ1aWxkLnhtbCBmaWxlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBnZW5lcmF0ZSBhIGNsaWVudC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlQ2xpZW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQ2xpZW50IDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgdG8gZ2VuZXJhdGUgY2xpZW50IHNpZGUgY29kZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIGEgc2VydmVyLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVTZXJ2ZXIgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmeSB0byBnZW5lcmF0ZSBzZXJ2ZXIgc2lkZSBjb2RlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVTZXJ2ZXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGJpbmRpbmcgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iamF4YiIKLSAgICAgKi8KLSAgICBEYXRhQmluZGluZyBnZXREYXRhYmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RGF0YWJpbmRpbmcgPGVtPkRhdGFiaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhYmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgKiBAc2VlICNnZXREYXRhYmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZnJvbnRlbmQgdXNlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iamF4d3MiCi0gICAgICovCi0gICAgRnJvbnRlbmQgZ2V0RnJvbnRlbmQoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbnRlbmQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQHNlZSAjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEZyb250ZW5kKEZyb250ZW5kIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWYgdGhlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0IGlzIHVzZWQgaW5zdGVhZCBvZiBjeGYtc2VydmxldC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJZiB0cnVlIHRoZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dCBpcyB1c2VkIG90aGVyd2lzZSBjeGYgc2VydmxldC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGJvb2xlYW4pCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGJvb2xlYW4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyIDxlbT5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc3RhbGxhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YWxsYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRJbnN0YWxsYXRpb25zKE1hcCkKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldENYRkNvbnRleHRfSW5zdGFsbGF0aW9ucygpCi0gICAgICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gZ2V0SW5zdGFsbGF0aW9ucygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0SW5zdGFsbGF0aW9ucyA8ZW0+SW5zdGFsbGF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFsbGF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0SW5zdGFsbGF0aW9ucygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SW5zdGFsbGF0aW9ucyhNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkRhdGFNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZEYXRhTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhMWNlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkRhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLS8qKgotICogCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1hGRGF0YU1vZGVsIGV4dGVuZHMgQ1hGQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgb3JpZ2luYXRpbmcgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBqYXZhIG9yIHdzZGwgcmVzb3VyY2UuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFByb2plY3ROYW1lIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIG9yaWdpbmF0aW5nIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgamF2YSBvciB3c2RsIHJlc291cmNlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIG91dHB1dCBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqICAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0UmVzb3VyY2VEaXJlY3RvcnkgPGVtPlJlc291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHBsYWNlZC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRSZXNvdXJjZURpcmVjdG9yeShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgc291cmNlcyBhcmUgY29tcGlsZWQgaW50by4KLSAgICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZmlsZXMgYXJlIG5vdCBjb21waWxlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2xhc3NEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q2xhc3NEaXJlY3RvcnkgPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBzb3VyY2VzIGFyZSBjb21waWxlZCBpbnRvLiBJZiBub3QKLSAgICAgKiBzcGVjaWZpZWQsIHRoZSBmaWxlcyBhcmUgbm90IGNvbXBpbGVkLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0Q2xhc3NEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENsYXNzRGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBXU0RMIEZpbGUgdGhhdCBpcyB1c2VkIGFzIGlucHV0IHRvIFdTREwySmF2YSBvcgotICAgICAqIGlzIHRoZSBvdXRwdXQgb2YgSmF2YTJXUy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0V3NkbEZpbGVOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxGaWxlTmFtZSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgRmlsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsRmlsZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV1NETCBVUkwuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgVVJMIGdldFdzZGxVUkwoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbFVSTCA8ZW0+V3NkbCBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgVVJMPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsVVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsVVJMKFVSTCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB3c2RsIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBXZWJDb250ZW50IGRpcmVjdG9yeS4KLSAgICAgKiBVc2VkIGluIHRoZSBzcHJpbmcgY29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ1dzZGxMb2NhdGlvbiA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENvbmZpZ1dzZGxMb2NhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSmF2YSBDbGFzcyB0aGF0IG1heSBiZSB1c2VkIGFzIGlucHV0IHRvIEphdmEyV1Mgb3IgaXMgdGhlIG91dHB1dAotICAgICAqIG9mIFdTREwySmF2YS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgSmF2YSBDbGFzcyB0aGF0IG1heSBiZSB1c2VkIGFzIGlucHV0IHRvIEphdmEyV1Mgb3IgaXMgdGhlIG91dHB1dCBvZiBXU0RMMkphdmEuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIEphdmEgSW50ZXJmYWNlIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIEphdmEgSW50ZXJmYWNlIHRoYXQgbWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gSmF2YTJXUy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogVXNlZCBpbiB0aGUgQ1hGIFNwcmluZyBDb25maWd1cmF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRDb25maWdJZCgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdJZCA8ZW0+Q29uZmlnIElkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgSWQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldENvbmZpZ0lkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRDb25maWdJZChTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdGFyZ2V0TmFtZXNwYWNlLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgdGFyZ2V0TmFtZXNwYWNlLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBlbmRvaW50TmFtZSBhdHRyaWJ1dGUgdXNlZCBpbiB0aGUgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBpbiB0aGUgQ1hGIFNwcmluZyBDb25maWd1cmF0aW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRFbmRwb2ludE5hbWUoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEVuZHBvaW50TmFtZSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5kcG9pbnROYW1lIGF0dHJpYnV0ZSB1c2VkIGluIHRoZSBqYXh3czplbmRwb2ludCBlbGVtZW50IGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RW5kcG9pbnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFbmRwb2ludE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHNlcnZpY2VOYW1lIGF0dHJpYnV0ZSB1c2VkIGluIHRoZSBqYXh3czplbmRwb2ludCBlbGVtZW50IGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFNlcnZpY2VOYW1lIDxlbT5TZXJ2aWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHNlcnZpY2VOYW1lIGF0dHJpYnV0ZSB1c2VkIGluIHRoZSBqYXh3czplbmRwb2ludCBlbGVtZW50IGluIHRoZSBDWEYgU3ByaW5nIENvbmZpZ3VyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0U2VydmljZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbERlZmluaXRpb24gPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0V3NkbERlZmluaXRpb24oRGVmaW5pdGlvbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0V3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLSAgICAgICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyMzllOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0NYRkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGRmFjdG9yeS5qYXZhLHYgMS4yIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkZhY3RvcnlJbXBsLmluaXQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgSmF2YTJXU0RhdGFNb2RlbCBjcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBXU0RMMkphdmFEYXRhTW9kZWwgY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluc3RhbGw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluc3RhbGw8L2VtPicuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRkluc3RhbGwgY3JlYXRlQ1hGSW5zdGFsbCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBDWEZQYWNrYWdlIGdldENYRlBhY2thZ2UoKTsKLQotfSAvL0NYRkZhY3RvcnkKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGSW5zdGFsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZJbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMjE3MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZJbnN0YWxsLmphdmEsdiAxLjEgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluc3RhbGw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZJbnN0YWxsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENYRkluc3RhbGwgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZJbnN0YWxsX1ZlcnNpb24oKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0VmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRMb2NhdGlvbihTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZJbnN0YWxsX0xvY2F0aW9uKCkKLSAgICAgKiBAbW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRDWEZJbnN0YWxsX1R5cGUoKQotICAgICAqIEBtb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIENYRkluc3RhbGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvQ1hGUGFja2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWNkZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9DWEZQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQ2ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGUGFja2FnZS5qYXZhLHYgMS40IDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDWEZQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOQU1FID0gIm1vZGVsIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwuZWNvcmUiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsIjsKLQotICAgIC8qKgotICAgICAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQ1hGUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFQgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19WRVJCT1NFID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUiA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkcgPSA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0NPTlRFWFRfX0ZST05URU5EID0gODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUID0gOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBvcnQgQ1hGIENsYXNzcGF0aCBDb250YWluZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TID0gMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGV4dDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UID0gMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUwgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9UWVBFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fVkVSQk9TRSA9IENYRl9DT05URVhUX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENsaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HID0gQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EID0gQ1hGX0NPTlRFWFRfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIgPSBDWEZfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbGxhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUyA9IENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fV1NETF9VUkwgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgV3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19JRCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZHBvaW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGEgTW9kZWw8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0IDxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fVkVSQk9TRSA9IENYRl9DT05URVhUX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEUgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ2xpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UID0gQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBTZXJ2ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fREFUQUJJTkRJTkcgPSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19GUk9OVEVORCA9IENYRl9DT05URVhUX19GUk9OVEVORDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU3ByaW5nIEFwcGxpY2F0aW9uIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0lOU1RBTExBVElPTlMgPSBDWEZfQ09OVEVYVF9fSU5TVEFMTEFUSU9OUzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwMTIgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdTREw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUwgPSAzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmJvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19WRVJCT1NFID0gQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQ0xJRU5UOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUiA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19EQVRBQklORElORyA9IENYRl9EQVRBX01PREVMX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0ZST05URU5EID0gQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IENYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUyA9IENYRl9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSA9IENYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlkgPSBDWEZfREFUQV9NT0RFTF9fQ0xBU1NfRElSRUNUT1JZOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBVUkw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19XU0RMX1VSTCA9IENYRl9EQVRBX01PREVMX19XU0RMX1VSTDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgV3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OID0gQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSA9IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19DT05GSUdfSUQgPSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kcG9pbnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IENYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwMTIgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdTREw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzc3BhdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEggPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgOTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIFN0YXJ0aW5nIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0cmFjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bbm5vdGF0aW9uIE1hcDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBKQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nIGNsYXNzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IEpBVkEyX1dTX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQgPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVCA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVFlQRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fVkVSQk9TRSA9IENYRl9DT05URVhUX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9DT05URVhUX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19EQVRBQklORElORyA9IENYRl9DT05URVhUX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fRlJPTlRFTkQgPSBDWEZfQ09OVEVYVF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19JTlNUQUxMQVRJT05TID0gQ1hGX0NPTlRFWFRfX0lOU1RBTExBVElPTlM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT04gPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBBcmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfQVJHUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vIEFkZHJlc3MgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBMb2NhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUiA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgU3luYyBNZXRob2RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBNYXJrIEdlbmVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBFcGlzb2RlIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEUgPSBDWEZfQ09OVEVYVF9GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBOYW1lIFJlc29sdXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OID0gQ1hGX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0gICAgLyoqCi0gICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0NPTlRFWFRfRkVBVFVSRV9DT1VOVCA9IENYRl9DT05URVhUX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCA8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRSA9IENYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVFlQRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT04gPSBDWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyYm9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVkVSQk9TRSA9IENYRl9EQVRBX01PREVMX19WRVJCT1NFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVCA9IENYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgU2VydmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVIgPSBDWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGFiaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19EQVRBQklORElORyA9IENYRl9EQVRBX01PREVMX19EQVRBQklORElORzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRlJPTlRFTkQgPSBDWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQgPSBDWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSID0gQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YWxsYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTlNUQUxMQVRJT05TID0gQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9KRUNUX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZID0gQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWSA9IENYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBGaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FID0gQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX1VSTCA9IENYRl9EQVRBX01PREVMX19XU0RMX1VSTDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgV3NkbCBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT047Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRSA9IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRSA9IENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NPTkZJR19JRCA9IENYRl9EQVRBX01PREVMX19DT05GSUdfSUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRSA9IENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVuZHBvaW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUgPSBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSA9IENYRl9EQVRBX01PREVMX19TRVJWSUNFX05BTUU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT04gPSBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04gPSBDWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgNDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIEFyZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm8gQWRkcmVzcyBCaW5kaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkcgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YamMgVG8gU3RyaW5nIFNpbXBsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEUgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIExvY2F0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SID0gQ1hGX0RBVEFfTU9ERUxfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhqYyBTeW5jIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIE1hcmsgR2VuZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WGpjIEVwaXNvZGUgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT04gPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CaW5kaW5nIEZpbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVMgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMTk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQgTmFtZXNwYWNlczwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgaW50IFdTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUyA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyMDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nIEZpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0NBVEFMT0dfRklMRSA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIFNvdXJjZSBGb2xkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUiA9IENYRl9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgKyAyMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicgY2xhc3MuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBpbnQgV1NETDJfSkFWQV9EQVRBX01PREVMX0ZFQVRVUkVfQ09VTlQgPSBDWEZfREFUQV9NT0RFTF9GRUFUVVJFX0NPVU5UICsgMjM7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsIDxlbT5JbnN0YWxsPC9lbT59JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldENYRkluc3RhbGwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgQ1hGX0lOU1RBTEwgPSA2OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfSU5TVEFMTF9fVkVSU0lPTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfSU5TVEFMTF9fTE9DQVRJT04gPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfSU5TVEFMTF9fVFlQRSA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5zdGFsbDwvZW0+JyBjbGFzcy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIGludCBDWEZfSU5TVEFMTF9GRUFUVVJFX0NPVU5UID0gMzsKLQotICAgIC8qKgotICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScgZW51bS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRGcm9udGVuZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGludCBGUk9OVEVORCA9IDc7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZyA8ZW0+RGF0YSBCaW5kaW5nPC9lbT59JyBlbnVtLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERhdGFCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IERBVEFfQklORElORyA9IDg7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVSTDwvZW0+JyBkYXRhIHR5cGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlIGphdmEubmV0LlVSTAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0VVJMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IFVSTCA9IDk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRlZmluaXRpb248L2VtPicgZGF0YSB0eXBlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldERlZmluaXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgREVGSU5JVElPTiA9IDEwOwotCi0gICAgLyoqCi0gICAgICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYXA8L2VtPicgZGF0YSB0eXBlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRNYXAoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBpbnQgTUFQID0gMTE7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklNZXRob2Q8L2VtPicgZGF0YSB0eXBlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRJTWV0aG9kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50IElNRVRIT0QgPSAxMjsKLQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQgPGVtPkNvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRDWEZDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24gPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgUnVudGltZSBMb2NhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVR5cGUgPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREZWZhdWx0UnVudGltZVR5cGUoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVmVyc2lvbiA8ZW0+RGVmYXVsdCBSdW50aW1lIFZlcnNpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNWZXJib3NlIDxlbT5WZXJib3NlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyYm9zZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVmVyYm9zZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUgPGVtPkdlbmVyYXRlIEFudCBCdWlsZCBGaWxlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVDbGllbnQgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZVNlcnZlciA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNnZXREYXRhYmluZGluZyA8ZW0+RGF0YWJpbmRpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhYmluZGluZzwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldERhdGFiaW5kaW5nKCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RhdGFiaW5kaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEZyb250ZW5kIDxlbT5Gcm9udGVuZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb250ZW5kPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRnJvbnRlbmQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgKiBAc2VlICNnZXRDWEZDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBzZWUgI2dldENYRkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0I2dldEluc3RhbGxhdGlvbnMgPGVtPkluc3RhbGxhdGlvbnM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnN0YWxsYXRpb25zPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQjZ2V0SW5zdGFsbGF0aW9ucygpCi0gICAgICogQHNlZSAjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9JbnN0YWxsYXRpb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsIDxlbT5EYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRDWEZEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRQcm9qZWN0TmFtZSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRQcm9qZWN0TmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRSZXNvdXJjZURpcmVjdG9yeSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRSZXNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfUmVzb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDbGFzc0RpcmVjdG9yeSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDbGFzc0RpcmVjdG9yeSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ2xhc3NEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRXc2RsRmlsZU5hbWUgPGVtPldzZGwgRmlsZSBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbEZpbGVOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbFVSTCA8ZW0+V3NkbCBVUkw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIFVSTDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbFVSTCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbFVSTCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldENvbmZpZ1dzZGxMb2NhdGlvbiA8ZW0+Q29uZmlnIFdzZGwgTG9jYXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Db25maWdXc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdJZCA8ZW0+Q29uZmlnIElkPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uZmlnIElkPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRDb25maWdJZCgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ29uZmlnSWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbCNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1RhcmdldE5hbWVzcGFjZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEVuZHBvaW50TmFtZSA8ZW0+RW5kcG9pbnQgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuZHBvaW50IE5hbWU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsI2dldEVuZHBvaW50TmFtZSgpCi0gICAgICogQHNlZSAjZ2V0Q1hGRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRW5kcG9pbnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0U2VydmljZU5hbWUgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcnZpY2UgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0U2VydmljZU5hbWUoKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1NlcnZpY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbERlZmluaXRpb24gPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbERlZmluaXRpb24oKQotICAgICAqIEBzZWUgI2dldENYRkRhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxEZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbExvY2F0aW9uIDxlbT5Xc2RsIExvY2F0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwjZ2V0V3NkbExvY2F0aW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsTG9jYXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCA8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNTb2FwMTJCaW5kaW5nIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzU29hcDEyQmluZGluZygpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X1NvYXAxMkJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVYU0RJbXBvcnRzIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVYU0RJbXBvcnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV1NETCA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFdTREw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdTREwoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9Bbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2VuZXJhdGUgV2ViIFBhcmFtIEFubm90YXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0NvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwgPGVtPkphdmEyIFdTIERhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRKYXZhMldTRGF0YU1vZGVsKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldENsYXNzcGF0aCA8ZW0+Q2xhc3NwYXRoPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0Q2xhc3NwYXRoKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0NsYXNzcGF0aCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRKYXZhU3RhcnRpbmdQb2ludCA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkphdmEgU3RhcnRpbmcgUG9pbnQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRKYXZhU3RhcnRpbmdQb2ludCgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9KYXZhU3RhcnRpbmdQb2ludCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzRXh0cmFjdEludGVyZmFjZSA8ZW0+RXh0cmFjdCBJbnRlcmZhY2U8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2lzRXh0cmFjdEludGVyZmFjZSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9FeHRyYWN0SW50ZXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldE1ldGhvZE1hcCA8ZW0+TWV0aG9kIE1hcDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBNYXA8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRNZXRob2RNYXAoKQotICAgICAqIEBzZWUgI2dldEphdmEyV1NEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfTWV0aG9kTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldEFubm90YXRpb25NYXAgPGVtPkFubm90YXRpb24gTWFwPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRBbm5vdGF0aW9uTWFwKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0Fubm90YXRpb25NYXAoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0U291cmNlRGlyZWN0b3J5IDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQHNlZSAjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9Tb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0UG9ydE5hbWUgPGVtPlBvcnQgTmFtZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvcnQgTmFtZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFBvcnROYW1lKCkKLSAgICAgKiBAc2VlICNnZXRKYXZhMldTRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1BvcnROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCA8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9HZW5lcmF0ZUltcGxlbWVudGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzUHJvY2Vzc1NPQVBIZWFkZXJzIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNQcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfUHJvY2Vzc1NPQVBIZWFkZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgPGVtPkxvYWQgRGVmYXVsdCBOYW1lc3BhY2UgUGFja2FnZSBOYW1lIE1hcHBpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVmFsaWRhdGUgPGVtPlZhbGlkYXRlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsaWRhdGU8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1ZhbGlkYXRlKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFdzZGxWZXJzaW9uIDxlbT5Xc2RsIFZlcnNpb248L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIFZlcnNpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRXc2RsVmVyc2lvbigpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1VzZURlZmF1bHRWYWx1ZXMgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Vc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0FyZ3MgPGVtPlhqYyBBcmdzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIEFyZ3M8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNnZXRYamNBcmdzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0FyZ3MoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNOb0FkZHJlc3NCaW5kaW5nIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc05vQWRkcmVzc0JpbmRpbmcoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTm9BZGRyZXNzQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1VzZURlZmF1bHRWYWx1ZXMgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZyA8ZW0+WGpjIFRvIFN0cmluZzwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBUbyBTdHJpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1RvU3RyaW5nKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ1NpbXBsZSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdTaW1wbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNMb2NhdG9yIDxlbT5YamMgTG9jYXRvcjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBMb2NhdG9yPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNMb2NhdG9yKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNTeW5jTWV0aG9kcyA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlhqYyBTeW5jIE1ldGhvZHM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1N5bmNNZXRob2RzKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY1N5bmNNZXRob2RzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjTWFya0dlbmVyYXRlZCA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNNYXJrR2VuZXJhdGVkKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFDb250ZXh0KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY01hcmtHZW5lcmF0ZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjRXBpc29kZUZpbGUgPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjRXBpc29kZUZpbGUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YUNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjRXBpc29kZUZpbGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNBdXRvTmFtZVJlc29sdXRpb24gPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0F1dG9OYW1lUmVzb2x1dGlvbigpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwgPGVtPldTREwyIEphdmEgRGF0YSBNb2RlbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVDbGFzcyBnZXRXU0RMMkphdmFEYXRhTW9kZWwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRJbmNsdWRlZE5hbWVzcGFjZXMgPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0luY2x1ZGVkTmFtZXNwYWNlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0QmluZGluZ0ZpbGVzIDxlbT5CaW5kaW5nIEZpbGVzPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CaW5kaW5nIEZpbGVzPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRCaW5kaW5nRmlsZXMoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0JpbmRpbmdGaWxlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcyA8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQHNlZSAjZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0Q2F0YWxvZ0ZpbGUgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGFsb2cgRmlsZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0Q2F0YWxvZ0ZpbGUoKQotICAgICAqIEBzZWUgI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0NhdGFsb2dGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SmF2YVNvdXJjZUZvbGRlciA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRKYXZhU291cmNlRm9sZGVyKCkKLSAgICAgKiBAc2VlICNnZXRXU0RMMkphdmFEYXRhTW9kZWwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9KYXZhU291cmNlRm9sZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCA8ZW0+SW5zdGFsbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JbnN0YWxsPC9lbT4nLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUNsYXNzIGdldENYRkluc3RhbGwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRWZXJzaW9uKCkKLSAgICAgKiBAc2VlICNnZXRDWEZJbnN0YWxsKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX1ZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRMb2NhdGlvbigpCi0gICAgICogQHNlZSAjZ2V0Q1hGSW5zdGFsbCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0Q1hGSW5zdGFsbF9Mb2NhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsI2dldFR5cGUoKQotICAgICAqIEBzZWUgI2dldENYRkluc3RhbGwoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfVHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQgPGVtPkZyb250ZW5kPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RnJvbnRlbmQ8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRnJvbnRlbmQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUVudW0gZ2V0RnJvbnRlbmQoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nIDxlbT5EYXRhIEJpbmRpbmc8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5EYXRhIEJpbmRpbmc8L2VtPicuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRUVudW0gZ2V0RGF0YUJpbmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm5ldC5VUkwgPGVtPlVSTDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VVJMPC9lbT4nLgotICAgICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSTCIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRURhdGFUeXBlIGdldFVSTCgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmF4LndzZGwuRGVmaW5pdGlvbiA8ZW0+RGVmaW5pdGlvbjwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmaW5pdGlvbjwvZW0+Jy4KLSAgICAgKiBAc2VlIGphdmF4LndzZGwuRGVmaW5pdGlvbgotICAgICAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZheC53c2RsLkRlZmluaXRpb24iCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEVEYXRhVHlwZSBnZXREZWZpbml0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLk1hcCA8ZW0+TWFwPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5NYXA8L2VtPicuCi0gICAgICogQHNlZSBqYXZhLnV0aWwuTWFwCi0gICAgICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEudXRpbC5NYXAiIHR5cGVQYXJhbWV0ZXJzPSJUIFQxIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBFRGF0YVR5cGUgZ2V0TWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCA8ZW0+SU1ldGhvZDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SU1ldGhvZDwvZW0+Jy4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLSAgICAgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCIKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgRURhdGFUeXBlIGdldElNZXRob2QoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIENYRkZhY3RvcnkgZ2V0Q1hGRmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0gICAgICogPHVsPgotICAgICAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAgICAgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICAgICAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICAgICAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgaW50ZXJmYWNlIExpdGVyYWxzIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dCA8ZW0+Q29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0Q1hGQ29udGV4dCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBDWEZfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9EZWZhdWx0UnVudGltZVR5cGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJib3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX1ZFUkJPU0UgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBDbGllbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFNlcnZlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJpbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fREFUQUJJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9EYXRhYmluZGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfQ09OVEVYVF9fRlJPTlRFTkQgPSBlSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9Gcm9udGVuZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX1VTRV9TUFJJTkdfQVBQTElDQVRJT05fQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFsbGF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TID0gZUlOU1RBTkNFLmdldENYRkNvbnRleHRfSW5zdGFsbGF0aW9ucygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCA8ZW0+RGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZEYXRhTW9kZWwoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQ2xhc3MgQ1hGX0RBVEFfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Qcm9qZWN0TmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1JFU09VUkNFX0RJUkVDVE9SWSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfUmVzb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIERpcmVjdG9yeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0NsYXNzRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIEZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfV3NkbEZpbGVOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFVSTDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19XU0RMX1VSTCA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfV3NkbFVSTCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFdzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q1hGRGF0YU1vZGVsX0NvbmZpZ1dzZGxMb2NhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZ1bGx5IFF1YWxpZmllZCBKYXZhIEludGVyZmFjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIENYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9UYXJnZXROYW1lc3BhY2UoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuZHBvaW50IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fRU5EUE9JTlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfRW5kcG9pbnROYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FID0gZUlOU1RBTkNFLmdldENYRkRhdGFNb2RlbF9TZXJ2aWNlTmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V3NkbCBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRDWEZEYXRhTW9kZWxfV3NkbExvY2F0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQgPGVtPkphdmEyIFdTIENvbnRleHQ8L2VtPn0nIGNsYXNzLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRKYXZhMldTQ29udGV4dCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBKQVZBMl9XU19DT05URVhUID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwMTIgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X1NvYXAxMkJpbmRpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVYU0RJbXBvcnRzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXU0RMPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OID0gZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCA8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0SmF2YTJXU0RhdGFNb2RlbCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBKQVZBMl9XU19EQVRBX01PREVMID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzcGF0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX0NsYXNzcGF0aCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBTdGFydGluZyBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0pBVkFfU1RBUlRJTkdfUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9KYXZhU3RhcnRpbmdQb2ludCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRyYWN0IEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfRXh0cmFjdEludGVyZmFjZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX01ldGhvZE1hcCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QW5ub3RhdGlvbiBNYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCA9IGVJTlNUQU5DRS5nZXRKYXZhMldTRGF0YU1vZGVsX0Fubm90YXRpb25NYXAoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvdXJjZSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZID0gZUlOU1RBTkNFLmdldEphdmEyV1NEYXRhTW9kZWxfU291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBKQVZBMl9XU19EQVRBX01PREVMX19QT1JUX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SmF2YTJXU0RhdGFNb2RlbF9Qb3J0TmFtZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQgPGVtPldTREwyIEphdmEgQ29udGV4dDwvZW0+fScgY2xhc3MuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0V1NETDJKYXZhQ29udGV4dCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBXU0RMMl9KQVZBX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dCgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfUHJvY2Vzc1NPQVBIZWFkZXJzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvYWQgRGVmYXVsdCBFeGNsdWRlcyBOYW1lcHNhY2UgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURSA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1dTRExfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1dzZGxWZXJzaW9uKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBBcmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfQVJHUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0FyZ3MoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vIEFkZHJlc3MgQmluZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTm9BZGRyZXNzQmluZGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBUbyBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdTaW1wbGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBMb2NhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhqYyBTeW5jIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WGpjIE1hcmsgR2VuZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNNYXJrR2VuZXJhdGVkKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YamMgRXBpc29kZSBGaWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19YSkNfRVBJU09ERV9GSUxFID0gZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjRXBpc29kZUZpbGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTiA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCA8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldFdTREwySmF2YURhdGFNb2RlbCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVDbGFzcyBXU0RMMl9KQVZBX0RBVEFfTU9ERUwgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9JbmNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJpbmRpbmcgRmlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQklORElOR19GSUxFUyA9IGVJTlNUQU5DRS5nZXRXU0RMMkphdmFEYXRhTW9kZWxfQmluZGluZ0ZpbGVzKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZCBOYW1lc3BhY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9FeGNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2cgRmlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFQXR0cmlidXRlIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFID0gZUlOU1RBTkNFLmdldFdTREwySmF2YURhdGFNb2RlbF9DYXRhbG9nRmlsZSgpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBTb3VyY2UgRm9sZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVIgPSBlSU5TVEFOQ0UuZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsIDxlbT5JbnN0YWxsPC9lbT59JyBjbGFzcy4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXRDWEZJbnN0YWxsKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUNsYXNzIENYRl9JTlNUQUxMID0gZUlOU1RBTkNFLmdldENYRkluc3RhbGwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfSU5TVEFMTF9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRDWEZJbnN0YWxsX1ZlcnNpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVBdHRyaWJ1dGUgQ1hGX0lOU1RBTExfX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENYRkluc3RhbGxfTG9jYXRpb24oKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUF0dHJpYnV0ZSBDWEZfSU5TVEFMTF9fVFlQRSA9IGVJTlNUQU5DRS5nZXRDWEZJbnN0YWxsX1R5cGUoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGVudW0uCi0gICAgICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldEZyb250ZW5kKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRUVudW0gRlJPTlRFTkQgPSBlSU5TVEFOQ0UuZ2V0RnJvbnRlbmQoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5EYXRhQmluZGluZyA8ZW0+RGF0YSBCaW5kaW5nPC9lbT59JyBlbnVtLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmcKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXREYXRhQmluZGluZygpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVFbnVtIERBVEFfQklORElORyA9IGVJTlNUQU5DRS5nZXREYXRhQmluZGluZygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VVJMPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgamF2YS5uZXQuVVJMCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGUGFja2FnZUltcGwjZ2V0VVJMKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRURhdGFUeXBlIFVSTCA9IGVJTlNUQU5DRS5nZXRVUkwoKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkRlZmluaXRpb248L2VtPicgZGF0YSB0eXBlLgotICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgICAgICogQHNlZSBqYXZheC53c2RsLkRlZmluaXRpb24KLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZQYWNrYWdlSW1wbCNnZXREZWZpbml0aW9uKCkKLSAgICAgICAgICogQGdlbmVyYXRlZAotICAgICAgICAgKi8KLSAgICAgICAgRURhdGFUeXBlIERFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+TWFwPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgamF2YS51dGlsLk1hcAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldE1hcCgpCi0gICAgICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgICAgICovCi0gICAgICAgIEVEYXRhVHlwZSBNQVAgPSBlSU5TVEFOQ0UuZ2V0TWFwKCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JTWV0aG9kPC9lbT4nIGRhdGEgdHlwZS4KLSAgICAgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRlBhY2thZ2VJbXBsI2dldElNZXRob2QoKQotICAgICAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICAgICAqLwotICAgICAgICBFRGF0YVR5cGUgSU1FVEhPRCA9IGVJTlNUQU5DRS5nZXRJTWV0aG9kKCk7Ci0KLSAgICB9Ci0KLX0gLy9DWEZQYWNrYWdlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0RhdGFCaW5kaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0RhdGFCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWZiMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9EYXRhQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogRGF0YUJpbmRpbmcuamF2YSx2IDEuMSAyMDA4LzExLzEwIDIwOjM3OjQzIGRhdmlkX3dpbGxpYW1zIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldERhdGFCaW5kaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBEYXRhQmluZGluZyBpbXBsZW1lbnRzIEVudW1lcmF0b3IgewotICAgIC8qKgotICAgICAqIFRoZSAnPGVtPjxiPkpBWEI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjSkFYQl9WQUxVRQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIEpBWEIoMCwgIkpBWEIiLCAiamF4YiIpOwotCi0gICAgLyoqCi0gICAgICogVGhlICc8ZW0+PGI+SkFYQjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SkFYQjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgICAqIDwvcD4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNKQVhCCi0gICAgICogQG1vZGVsIGxpdGVyYWw9ImpheGIiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFYQl9WQUxVRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRhQmluZGluZ1tdIFZBTFVFU19BUlJBWSA9Ci0gICAgICAgIG5ldyBEYXRhQmluZGluZ1tdIHsKLSAgICAgICAgICAgIEpBWEIsCi0gICAgICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RGF0YUJpbmRpbmc+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGF0YSBCaW5kaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGF0YUJpbmRpbmcgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBEYXRhQmluZGluZyByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGFCaW5kaW5nIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRGF0YUJpbmRpbmcgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRhdGEgQmluZGluZzwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERhdGFCaW5kaW5nIGdldChpbnQgdmFsdWUpIHsKLSAgICAgICAgc3dpdGNoICh2YWx1ZSkgewotICAgICAgICAgICAgY2FzZSBKQVhCX1ZBTFVFOiByZXR1cm4gSkFYQjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0gICAgLyoqCi0gICAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRGF0YUJpbmRpbmcoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICB9Ci0gICAgCi19IC8vRGF0YUJpbmRpbmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRnJvbnRlbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvRnJvbnRlbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRhOWEwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0Zyb250ZW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBGcm9udGVuZC5qYXZhLHYgMS4xIDIwMDgvMTEvMTAgMjA6Mzc6NDMgZGF2aWRfd2lsbGlhbXMgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNnZXRGcm9udGVuZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRnJvbnRlbmQgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLSAgICAvKioKLSAgICAgKiBUaGUgJzxlbT48Yj5KQVhXUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNKQVhXU19WQUxVRQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIEpBWFdTKDAsICJKQVhXUyIsICJqYXh3cyIpOwotCi0gICAgLyoqCi0gICAgICogVGhlICc8ZW0+PGI+SkFYV1M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkpBWFdTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI0pBWFdTCi0gICAgICogQG1vZGVsIGxpdGVyYWw9ImpheHdzIgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBWFdTX1ZBTFVFID0gMDsKLQotICAgIC8qKgotICAgICAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnJvbnRlbmRbXSBWQUxVRVNfQVJSQVkgPQotICAgICAgICBuZXcgRnJvbnRlbmRbXSB7Ci0gICAgICAgICAgICBKQVhXUywKLSAgICAgICAgfTsKLQotICAgIC8qKgotICAgICAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Gcm9udGVuZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEZyb250ZW5kPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRnJvbnRlbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBGcm9udGVuZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICAgICAgICBpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZyb250ZW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRnJvbnRlbmQgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBGcm9udGVuZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlICc8ZW0+PGI+RnJvbnRlbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGcm9udGVuZCBnZXQoaW50IHZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAodmFsdWUpIHsKLSAgICAgICAgICAgIGNhc2UgSkFYV1NfVkFMVUU6IHJldHVybiBKQVhXUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0gICAgLyoqCi0gICAgICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRnJvbnRlbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbGl0ZXJhbDsKLSAgICB9Ci0gICAgCi19IC8vRnJvbnRlbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0NvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0NvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0OWQ3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL0phdmEyV1NDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi0vKioKLSAqIAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YTJXU0NvbnRleHQgZXh0ZW5kcyBDWEZDb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBXU0RMIGlzIHRvIGluY2x1ZGUgYSBTT0FQIDEuMiBiaW5kaW5nLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzU29hcDEyQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzU29hcDEyQmluZGluZyA8ZW0+U29hcDEyIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZmllcyB0aGF0IHRoZSBnZW5lcmF0ZWQgV1NETCBpcyB0byBpbmNsdWRlIGEgU09BUCAxLjIgYmluZGluZy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwMTIgQmluZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNTb2FwMTJCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTb2FwMTJCaW5kaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIG91dHB1dCBzY2hlbWFzIHRvIHNlcGFyYXRlIGZpbGVzIGFuZCB1c2UgaW1wb3J0cyB0bwotICAgICAqIGxvYWQgdGhlbSBpbnN0ZWFkIG9mIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVYU0RJbXBvcnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVhTREltcG9ydHMgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBPdXRwdXQgc2NoZW1hcyB0byBzZXBhcmF0ZSBmaWxlcyBhbmQgdXNlIGltcG9ydHMgdG8gbG9hZCB0aGVtIGluc3RlYWQgb2YKLSAgICAgKiBpbmxpbmluZyB0aGVtIGludG8gdGhlIHdzZGwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgWFNEIEltcG9ydHM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVYU0RJbXBvcnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdG8gZ2VuZXJhdGUgd3NkbC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVXU0RMKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVdTREwgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIFdTREwgZmlsZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBXU0RMPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVXU0RMKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIHdyYXBwZXIgYmVhbnMuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMgPGVtPkdlbmVyYXRlIFdyYXBwZXIgRmF1bHQgQmVhbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIgYW5kIGZhdWx0IGJlYW4uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBBbm5vdGF0aW9uIFByb2Nlc3NpbmcgVG9vbCAoQVBUKSBpcyBlbmFibGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPGVtPkFubm90YXRpb24gUHJvY2Vzc2luZyBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXQgdG8gZW5hYmxlIHRoZSBBbm5vdGF0aW9uIFByb2Nlc3NpbmcgVG9vbCAoQVBUKSBleHRlbnNpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPkBXZWJNZXRob2Q8L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmFibGVtZW50IG9mIHRoZSA8Y29kZT5AV2ViTWV0aG9kPC9jb2RlPiBhbm5vdGF0aW9uIGdlbmVyYXRpb24uCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgV2ViIE1ldGhvZCBBbm5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSA8Y29kZT5AV2ViUGFyYW08L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NDb250ZXh0I2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTZXRzIHRoZSBlbmFibGVtZW50IG9mIHRoZSA8Y29kZT5AV2ViUGFyYW08L2NvZGU+IGFubm90YXRpb24gZ2VuZXJhdGlvbi4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIDxjb2RlPkBSZXF1ZXN0V3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbiA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIDxjb2RlPkBSZXF1ZXN0V3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFJlcXVlc3QgV3JhcHBlciBBbm5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgPGNvZGU+QFJlc3BvbnNlV3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiB0aGUgPGNvZGU+QFJlc3BvbnNlV3JhcHBlcjwvY29kZT4gYW5ub3RhdGlvbiBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvSmF2YTJXU0RhdGFNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTRGF0YU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjZjNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9KYXZhMldTRGF0YU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci0KLS8qKgotICogCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhMldTRGF0YU1vZGVsIGV4dGVuZHMgQ1hGRGF0YU1vZGVsLCBKYXZhMldTQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY2xhc3NwYXRoIHNlYXJjaGVkIHdoZW4gcHJvY2Vzc2luZy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRDbGFzc3BhdGggPGVtPkNsYXNzcGF0aDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgY2xhc3NwYXRoIHRvIHNlYXJjaCB3aGVuIHByb2Nlc3NpbmcuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NwYXRoPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDbGFzc3BhdGgoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgSmF2YSBzdGFydGluZyBwb2ludCBhcnRpZmFjdC4gVGhpcyBjYW4gYmUgZWl0aGVyIGEgSmF2YSBDbGFzcyBvciBJbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRKYXZhU3RhcnRpbmdQb2ludCA8ZW0+SmF2YSBTdGFydGluZyBQb2ludDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgSmF2YSBzdGFydGluZyBwb2ludCBhcnRpZmFjdC4gSXQgbWF5IGJlIGEgSmF2YSBDbGFzcyBvciBJbnRlcmZhY2UuCi0gICAgICogQHNlZSAjc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkKLSAgICAgKiBAc2VlICNzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRKYXZhU3RhcnRpbmdQb2ludCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0SmF2YVN0YXJ0aW5nUG9pbnQoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIElmIHRoZSBzdGFydGluZyBwb2ludCBpcyBhIEphdmEgQ2xhc3MgdGhpcyB0cmFja3Mgd2hldGhlciB0byB1c2UgYW4gU0VJIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlVzZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIHN0YXJ0aW5nIHBvaW50IGlzIGEgSmF2YSBDbGFzcyB0aGlzIHRyYWNrcyB3aGV0aGVyIHRvIG9wdGlvbiB0bwotICAgICAqIGV4dHJhY3QgdGhlIFNFSSBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzRXh0cmFjdEludGVyZmFjZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjaXNFeHRyYWN0SW50ZXJmYWNlIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgb3B0aW9uIHRvIGV4dHJhY3QgdGhlIFNFSSBmcm9tIHRoZSBKYXZhIGNsYXNzIHN0YXJ0aW5nIHBvaW50LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0V4dHJhY3RJbnRlcmZhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEV4dHJhY3RJbnRlcmZhY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXcgU0VJIG5hbWUuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG1hcCBvZiB0aGUgbWV0aG9kcyB0byB1c2UgYW5kIHRoZWlyIGFubm90YXRpb25zLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gZ2V0TWV0aG9kTWFwKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbCNnZXRNZXRob2RNYXAgPGVtPk1ldGhvZCBNYXA8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIG1hcCBvZiB0aGUgbWV0aG9kcyB0byB1c2UgYW5kIHRoZSBtZXRob2QgYW5ub3RhdGlvbnMuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE1hcDwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0TWV0aG9kTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRNZXRob2RNYXAoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIGVuYWJsZWQgZGVmYXVsdCBtZXRob2QgYW5ub3RhdGlvbnMKLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRBbm5vdGF0aW9uTWFwKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWwjZ2V0QW5ub3RhdGlvbk1hcCA8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgYSBtYXAgb2YgdGhlIGVuYWJsZWQgbWV0aG9kIGFubm90YXRpb25zLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFubm90YXRpb24gTWFwPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRBbm5vdGF0aW9uTWFwKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRBbm5vdGF0aW9uTWFwKE1hcDxTdHJpbmcsIEJvb2xlYW4+IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhcmUgcGxhY2VkLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRTb3VyY2VEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFNvdXJjZURpcmVjdG9yeSA8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU2V0cyB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGFyZSBwbGFjZWQuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlIERpcmVjdG9yeTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0U291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRTb3VyY2VEaXJlY3RvcnkoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBvcnQgbmFtZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgd3NkbC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0UG9ydE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHBvcnQgbmFtZSB0byB1c2UgaW4gdGhlIGdlbmVyYXRlZCB3c2RsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFBvcnROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvV1NETDJKYXZhQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmExNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi0vKioKLSAqIAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV1NETDJKYXZhQ29udGV4dCBleHRlbmRzIENYRkNvbnRleHQgewotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZ2VuZXJhdGUgc3RhcnRpbmcgcG9pbnQgY29kZSBmb3IgYW4gaW1wbGVtZW50YXRpb24gb2JqZWN0LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnMgKGkuZS4gU09BUCBoZWFkZXJzCi0gICAgICogZGVmaW5lZCBpbiB0aGUgd3NkbDpiaW5kaW5nIGJ1dCBub3Qgd3NkbDpwb3J0VHlwZSBzZWN0aW9uLikgaXMgZW5hYmxlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNQcm9jZXNzU09BUEhlYWRlcnMgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHByb2Nlc3Npbmcgb2YgaW1wbGljaXQgU09BUCBoZWFkZXJzIChpLmUuIFNPQVAKLSAgICAgKiBoZWFkZXJzIGRlZmluZWQgaW4gdGhlIHdzZGw6YmluZGluZyBidXQgbm90IHdzZGw6cG9ydFR5cGUgc2VjdGlvbi4pCi0gICAgICogRGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFByb2Nlc3NTT0FQSGVhZGVycyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcgaXMgZW5hYmxlZC4gCi0gICAgICogRGVmYXVsdCBpcyB0cnVlLgotICAgICAqIAotICAgICAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIgotICAgICAqLwotICAgIGJvb2xlYW4gaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogRW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZy4KLSAgICAgKiBEZWZhdWx0IGlzIHRydWUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcgaXMgZW5hYmxlZC4KLSAgICAgKiBEZWZhdWx0IGlzIHRydWUuCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9InRydWUiCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCBleGNsdWRlcyBuYW1lc3BhY2UgbWFwcGluZy4KLSAgICAgKiBEZWZhdWx0IGlzIHRydWUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9hZCBEZWZhdWx0IEV4Y2x1ZGVzIE5hbWVwc2FjZSBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byB2YWxpZGF0ZSB0aGUgV1NETCBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgY29kZS4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVmFsaWRhdGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzVmFsaWRhdGUgPGVtPlZhbGlkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBFbmFibGVzIFdTREwgdmFsaWRhdGlvbiBiZWZvcmUgY29kZSBnZW5lcmF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1ZhbGlkYXRlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHdzZGwgdmVyc2lvbiAuRGVmYXVsdCBpcyBXU0RMMS4xLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBXU0RMMS4xIHZlcnNpb24uCi0gICAgICogCi0gICAgICogQG1vZGVsIGRlZmF1bHQ9IjEuMSIKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0V3NkbFZlcnNpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFdzZGxWZXJzaW9uIDxlbT5Xc2RsIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldzZGwgVmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0V3NkbFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFdzZGxWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRvb2wgaXMgc2V0IHRvIGdlbmVyYXRlIGRlZmF1bHQgdmFsZXMgZm9yIHRoZQotICAgICAqIGdlbmVyYXRlZCBjbGllbnQgYW5kIHRoZSBnZW5lcmF0ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgICoKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIKLSAgICAgKi8KLSAgICBib29sZWFuIGlzVXNlRGVmYXVsdFZhbHVlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNVc2VEZWZhdWx0VmFsdWVzIDxlbT5Vc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEdlbmVyYXRlIGRlZmF1bHQgdmFsZXMgZm9yIHRoZSBnZW5lcmF0ZWQgY2xpZW50IGFuZCB0aGUgZ2VuZXJhdGVkIGltcGxlbWVudGF0aW9uLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRVc2VEZWZhdWx0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBkaXJlY3RseSB0bwotICAgICAqIHRoZSBYSkMgd2hlbiB0aGUgSkFYQiBiaW5kaW5nIGlzIGJlaW5nIHVzZWQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldFhqY0FyZ3MoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2dldFhqY0FyZ3MgPGVtPlhqYyBBcmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgQXJnczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0WGpjQXJncygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjQXJncyhTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB0b29sIGlzIHNldCB0byB1c2UgdGhlIENYRiBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIAotICAgICAqIHR5cGUgaW5zdGVhZCBvZiB0aGUgSkFYLVdTIDIuMSBjb21wbGlhbnQgbWFwcGluZy4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzTm9BZGRyZXNzQmluZGluZygpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNOb0FkZHJlc3NCaW5kaW5nIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIEluc3RydWN0cyB0aGUgdG9vbCB0byB1c2UgdGhlIENYRiBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIHR5cGUgCi0gICAgICogaW5zdGVhZCBvZiB0aGUgSkFYLVdTIDIuMSBjb21wbGlhbnQgbWFwcGluZy4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Tm9BZGRyZXNzQmluZGluZyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBYSkMgd2lsbCBpbml0aWFsaXplIGZpZWxkcyBtYXBwZWQgZnJvbSBlbGVtZW50cyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1VzZURlZmF1bHRWYWx1ZXMgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciBYSkMgd2lsbCBnZW5lcmF0ZSBhIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVG9TdHJpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmcgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBUbyBTdHJpbmc8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1RvU3RyaW5nKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIG11bHRpIGxpbmUgb3V0cHV0IGlzIGVuYWJsZWQgZm9yIDxjb2RlPnRvU3RyaW5nKCk8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNUb1N0cmluZ011bHRpTGluZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNUb1N0cmluZ011bHRpTGluZSA8ZW0+WGpjIFRvIFN0cmluZyBNdWx0aSBMaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRlcnNlIG91dHB1dCBpcyBlbmFibGVkIGZvciA8Y29kZT50b1N0cmluZygpPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjVG9TdHJpbmdTaW1wbGUoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzWGpjVG9TdHJpbmdTaW1wbGUgPGVtPlhqYyBUbyBTdHJpbmcgU2ltcGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ1NpbXBsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgc291cmNlIGxvY2F0aW9uIHN1cHBvcnQgaXMgZW5hYmxlZC4KLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBib29sZWFuIGlzWGpjTG9jYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjaXNYamNMb2NhdG9yIDxlbT5YamMgTG9jYXRvcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIExvY2F0b3I8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzWGpjTG9jYXRvcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgWEpDIHdpbGwgZ2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoICdzeW5jaHJvbml6ZWQnIGtleXdvcmQuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1hqY1N5bmNNZXRob2RzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY1N5bmNNZXRob2RzIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YamMgU3luYyBNZXRob2RzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY1N5bmNNZXRob2RzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgWEpDIHdpbGwgbWFyayB0aGUgY29kZSBhcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIGFubm90YXRpb25zLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIGJvb2xlYW4gaXNYamNNYXJrR2VuZXJhdGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dCNpc1hqY01hcmtHZW5lcmF0ZWQgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNpc1hqY01hcmtHZW5lcmF0ZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldFhqY01hcmtHZW5lcmF0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZXBpc29kZSBmaWxlIGxvY2F0aW9uLgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIFN0cmluZyBnZXRYamNFcGlzb2RlRmlsZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQjZ2V0WGpjRXBpc29kZUZpbGUgPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldFhqY0VwaXNvZGVGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRYamNFcGlzb2RlRmlsZShTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0byBOYW1lIFJlc29sdXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gTmFtZSBSZXNvbHV0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbikKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlI2dldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIGJvb2xlYW4gaXNBdXRvTmFtZVJlc29sdXRpb24oKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0I2lzQXV0b05hbWVSZXNvbHV0aW9uIDxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRBdXRvTmFtZVJlc29sdXRpb24oYm9vbGVhbiB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YURhdGFNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9XU0RMMkphdmFEYXRhTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0MGJkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL1dTREwySmF2YURhdGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXU0RMMkphdmFEYXRhTW9kZWwgZXh0ZW5kcyBDWEZEYXRhTW9kZWwsIFdTREwySmF2YUNvbnRleHQgewotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZXMgdG8gdXNlIGZvciB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0SW5jbHVkZWROYW1lc3BhY2VzIDxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBTcGVjaWZpZXMgemVybywgb3IgbW9yZSwgcGFja2FnZSBuYW1lcyB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBMaXN0IG9mIHRoZSBKQVhXUyBvciBKQVhCIGJpbmRpbmcgZmlsZXMgdXNlZCwgaWYgYW55LgotICAgICAqIAotICAgICAqIEBtb2RlbAotICAgICAqLwotICAgIExpc3Q8U3RyaW5nPiBnZXRCaW5kaW5nRmlsZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGphdmEgcGFja2FnZSB0byBleGNsdWRlZCBuYW1lc3BhY2UgbWFwcGluZ3MuCi0gICAgICogCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFeGNsdWRlZE5hbWVzcGFjZXMoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwjZ2V0RXhjbHVkZWROYW1lc3BhY2VzIDxlbT5FeGNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBJZ25vcmUgdGhlIHNwZWNpZmllZCBXU0RMIHNjaGVtYSBuYW1lc3BhY2Ugd2hlbiBnZW5lcmF0aW5nIGNvZGUuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+JyBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgdm9pZCBzZXRFeGNsdWRlZE5hbWVzcGFjZXMoTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjYXRhbG9nIGZpbGUgdXNlZCB0byBtYXAgdGhlIGltcG9ydGVkIHdzZGwvc2NoZW1hCi0gICAgICogQG1vZGVsCi0gICAgICovCi0gICAgU3RyaW5nIGdldENhdGFsb2dGaWxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsI2dldENhdGFsb2dGaWxlIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNwZWNpZnkgY2F0YWxvZyBmaWxlIHRvIG1hcCB0aGUgaW1wb3J0ZWQgd3NkbC9zY2hlbWEuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KLSAgICAgKiBAc2VlICNnZXRDYXRhbG9nRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHZvaWQgc2V0Q2F0YWxvZ0ZpbGUoU3RyaW5nIHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIFNvdXJjZSBEaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZmlsZXMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiAKLSAgICAgKiBAbW9kZWwKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0SmF2YVNvdXJjZUZvbGRlcigpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCNnZXRKYXZhU291cmNlRm9sZGVyIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBKYXZhIFNvdXJjZSBEaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZmlsZXMgYXJlIGdlbmVyYXRlZC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPicgYXR0cmlidXRlLgotICAgICAqIEBzZWUgI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkRhdGFNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZEYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNGRjZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkRhdGFNb2RlbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MjAgKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZEYXRhTW9kZWxJbXBsLmphdmEsdiAxLjQgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkRhdGFCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5Gcm9udGVuZDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBNb2RlbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uIDxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXREZWZhdWx0UnVudGltZVZlcnNpb24gPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2lzVmVyYm9zZSA8ZW0+VmVyYm9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlQW50QnVpbGRGaWxlIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlQ2xpZW50IDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVNlcnZlciA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldERhdGFiaW5kaW5nIDxlbT5EYXRhYmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRGcm9udGVuZCA8ZW0+RnJvbnRlbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEluc3RhbGxhdGlvbnMgPGVtPkluc3RhbGxhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0UHJvamVjdE5hbWUgPGVtPlByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRSZXNvdXJjZURpcmVjdG9yeSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldENsYXNzRGlyZWN0b3J5IDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0V3NkbEZpbGVOYW1lIDxlbT5Xc2RsIEZpbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsVVJMIDxlbT5Xc2RsIFVSTDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRDb25maWdXc2RsTG9jYXRpb24gPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgQ2xhc3MgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBJbnRlcmZhY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRDb25maWdJZCA8ZW0+Q29uZmlnIElkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRFbmRwb2ludE5hbWUgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkRhdGFNb2RlbEltcGwjZ2V0U2VydmljZU5hbWUgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGRGF0YU1vZGVsSW1wbCNnZXRXc2RsRGVmaW5pdGlvbiA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5DWEZEYXRhTW9kZWxJbXBsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENYRkRhdGFNb2RlbEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENYRkRhdGFNb2RlbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKSA8ZW0+RGVmYXVsdCBSdW50aW1lIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA9IERFRkFVTFRfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0UnVudGltZVR5cGUoKSA8ZW0+RGVmYXVsdCBSdW50aW1lIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERlZmF1bHRSdW50aW1lVHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkgPGVtPkRlZmF1bHQgUnVudGltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJ1bnRpbWVUeXBlID0gREVGQVVMVF9SVU5USU1FX1RZUEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkgPGVtPkRlZmF1bHQgUnVudGltZSBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRSdW50aW1lVmVyc2lvbigpIDxlbT5EZWZhdWx0IFJ1bnRpbWUgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSdW50aW1lVmVyc2lvbiA9IERFRkFVTFRfUlVOVElNRV9WRVJTSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyYm9zZSgpIDxlbT5WZXJib3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJCT1NFX0VERUZBVUxUID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmVyYm9zZSgpIDxlbT5WZXJib3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZlcmJvc2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBWRVJCT1NFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKSA8ZW0+R2VuZXJhdGUgQW50IEJ1aWxkIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVBbnRCdWlsZEZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIDxlbT5HZW5lcmF0ZSBBbnQgQnVpbGQgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVBbnRCdWlsZEZpbGUgPSBHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlQ2xpZW50KCkgPGVtPkdlbmVyYXRlIENsaWVudDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZUNsaWVudCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0NMSUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNsaWVudCgpIDxlbT5HZW5lcmF0ZSBDbGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVDbGllbnQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ2xpZW50ID0gR0VORVJBVEVfQ0xJRU5UX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVTZXJ2ZXIoKSA8ZW0+R2VuZXJhdGUgU2VydmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlU2VydmVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfU0VSVkVSX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlU2VydmVyKCkgPGVtPkdlbmVyYXRlIFNlcnZlcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVNlcnZlcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIgPSBHRU5FUkFURV9TRVJWRVJfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YWJpbmRpbmcoKSA8ZW0+RGF0YWJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldERhdGFiaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGFCaW5kaW5nIERBVEFCSU5ESU5HX0VERUZBVUxUID0gRGF0YUJpbmRpbmcuSkFYQjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFiaW5kaW5nKCkgPGVtPkRhdGFiaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXREYXRhYmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERhdGFCaW5kaW5nIGRhdGFiaW5kaW5nID0gREFUQUJJTkRJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbnRlbmQoKSA8ZW0+RnJvbnRlbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZyb250ZW5kKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZyb250ZW5kIEZST05URU5EX0VERUZBVUxUID0gRnJvbnRlbmQuSkFYV1M7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9udGVuZCgpIDxlbT5Gcm9udGVuZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0RnJvbnRlbmQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBGcm9udGVuZCBmcm9udGVuZCA9IEZST05URU5EX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgPGVtPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFRfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSA8ZW0+VXNlIFNwcmluZyBBcHBsaWNhdGlvbiBDb250ZXh0PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ID0gVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgPGVtPkV4cG9ydCBDWEYgQ2xhc3NwYXRoIENvbnRhaW5lcjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSA8ZW0+RXhwb3J0IENYRiBDbGFzc3BhdGggQ29udGFpbmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyID0gRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFsbGF0aW9ucygpIDxlbT5JbnN0YWxsYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbnN0YWxsYXRpb25zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbGF0aW9uczsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TmFtZSgpIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE5hbWUoKSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRQcm9qZWN0TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZSA9IFBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpIDxlbT5SZXNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFJlc291cmNlRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VEaXJlY3RvcnkoKSA8ZW0+UmVzb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRSZXNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc0RpcmVjdG9yeSgpIDxlbT5DbGFzcyBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENsYXNzRGlyZWN0b3J5KCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19ESVJFQ1RPUllfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NEaXJlY3RvcnkoKSA8ZW0+Q2xhc3MgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDbGFzc0RpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc0RpcmVjdG9yeSA9IENMQVNTX0RJUkVDVE9SWV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsRmlsZU5hbWUoKSA8ZW0+V3NkbCBGaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxGaWxlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbEZpbGVOYW1lKCkgPGVtPldzZGwgRmlsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsRmlsZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgd3NkbEZpbGVOYW1lID0gV1NETF9GSUxFX05BTUVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFVSTCgpIDxlbT5Xc2RsIFVSTDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbFVSTCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkwgV1NETF9VUkxfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFVSTCgpIDxlbT5Xc2RsIFVSTDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbFVSTCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFVSTCB3c2RsVVJMID0gV1NETF9VUkxfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgPGVtPkNvbmZpZyBXc2RsIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRDb25maWdXc2RsTG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1dzZGxMb2NhdGlvbigpIDxlbT5Db25maWcgV3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1dzZGxMb2NhdGlvbiA9IENPTkZJR19XU0RMX0xPQ0FUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIDxlbT5GdWxseSBRdWFsaWZpZWQgSmF2YSBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgPGVtPkZ1bGx5IFF1YWxpZmllZCBKYXZhIENsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPSBGVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSA8ZW0+RnVsbHkgUXVhbGlmaWVkIEphdmEgSW50ZXJmYWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IEZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ0lkKCkgPGVtPkNvbmZpZyBJZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q29uZmlnSWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19JRF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdJZCgpIDxlbT5Db25maWcgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENvbmZpZ0lkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ0lkID0gQ09ORklHX0lEX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZHBvaW50TmFtZSgpIDxlbT5FbmRwb2ludCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRFbmRwb2ludE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kcG9pbnROYW1lKCkgPGVtPkVuZHBvaW50IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEVuZHBvaW50TmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbmRwb2ludE5hbWUgPSBFTkRQT0lOVF9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VOYW1lKCkgPGVtPlNlcnZpY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZU5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlTmFtZSgpIDxlbT5TZXJ2aWNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNlcnZpY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZpY2VOYW1lID0gU0VSVklDRV9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxEZWZpbml0aW9uKCkgPGVtPldzZGwgRGVmaW5pdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbERlZmluaXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmaW5pdGlvbiBXU0RMX0RFRklOSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbERlZmluaXRpb24oKSA8ZW0+V3NkbCBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsRGVmaW5pdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSBXU0RMX0RFRklOSVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXc2RsTG9jYXRpb24oKSA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbExvY2F0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ1hGRGF0YU1vZGVsSW1wbCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLSAgICAgICAgcmV0dXJuIENYRlBhY2thZ2UuTGl0ZXJhbHMuQ1hGX0RBVEFfTU9ERUw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKFN0cmluZyBuZXdEZWZhdWx0UnVudGltZUxvY2F0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGREZWZhdWx0UnVudGltZUxvY2F0aW9uID0gZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbjsKLSAgICAgICAgZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiA9IG5ld0RlZmF1bHRSdW50aW1lTG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTiwgb2xkRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiwgZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdFJ1bnRpbWVUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRSdW50aW1lVHlwZShTdHJpbmcgbmV3RGVmYXVsdFJ1bnRpbWVUeXBlKSB7Ci0gICAgICAgIFN0cmluZyBvbGREZWZhdWx0UnVudGltZVR5cGUgPSBkZWZhdWx0UnVudGltZVR5cGU7Ci0gICAgICAgIGRlZmF1bHRSdW50aW1lVHlwZSA9IG5ld0RlZmF1bHRSdW50aW1lVHlwZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEUsIG9sZERlZmF1bHRSdW50aW1lVHlwZSwgZGVmYXVsdFJ1bnRpbWVUeXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0UnVudGltZVZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKFN0cmluZyBuZXdEZWZhdWx0UnVudGltZVZlcnNpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZERlZmF1bHRSdW50aW1lVmVyc2lvbiA9IGRlZmF1bHRSdW50aW1lVmVyc2lvbjsKLSAgICAgICAgZGVmYXVsdFJ1bnRpbWVWZXJzaW9uID0gbmV3RGVmYXVsdFJ1bnRpbWVWZXJzaW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTiwgb2xkRGVmYXVsdFJ1bnRpbWVWZXJzaW9uLCBkZWZhdWx0UnVudGltZVZlcnNpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0gICAgICAgIHJldHVybiB2ZXJib3NlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiBuZXdWZXJib3NlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVmVyYm9zZSA9IHZlcmJvc2U7Ci0gICAgICAgIHZlcmJvc2UgPSBuZXdWZXJib3NlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFLCBvbGRWZXJib3NlLCB2ZXJib3NlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlQW50QnVpbGRGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKGJvb2xlYW4gbmV3R2VuZXJhdGVBbnRCdWlsZEZpbGUpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZUFudEJ1aWxkRmlsZSA9IGdlbmVyYXRlQW50QnVpbGRGaWxlOwotICAgICAgICBnZW5lcmF0ZUFudEJ1aWxkRmlsZSA9IG5ld0dlbmVyYXRlQW50QnVpbGRGaWxlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSwgb2xkR2VuZXJhdGVBbnRCdWlsZEZpbGUsIGdlbmVyYXRlQW50QnVpbGRGaWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUNsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ2xpZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlQ2xpZW50KGJvb2xlYW4gbmV3R2VuZXJhdGVDbGllbnQpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZUNsaWVudCA9IGdlbmVyYXRlQ2xpZW50OwotICAgICAgICBnZW5lcmF0ZUNsaWVudCA9IG5ld0dlbmVyYXRlQ2xpZW50OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQsIG9sZEdlbmVyYXRlQ2xpZW50LCBnZW5lcmF0ZUNsaWVudCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVNlcnZlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihib29sZWFuIG5ld0dlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVTZXJ2ZXIgPSBnZW5lcmF0ZVNlcnZlcjsKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXIgPSBuZXdHZW5lcmF0ZVNlcnZlcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSLCBvbGRHZW5lcmF0ZVNlcnZlciwgZ2VuZXJhdGVTZXJ2ZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUJpbmRpbmcgZ2V0RGF0YWJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhYmluZGluZyhEYXRhQmluZGluZyBuZXdEYXRhYmluZGluZykgewotICAgICAgICBEYXRhQmluZGluZyBvbGREYXRhYmluZGluZyA9IGRhdGFiaW5kaW5nOwotICAgICAgICBkYXRhYmluZGluZyA9IG5ld0RhdGFiaW5kaW5nID09IG51bGwgPyBEQVRBQklORElOR19FREVGQVVMVCA6IG5ld0RhdGFiaW5kaW5nOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19EQVRBQklORElORywgb2xkRGF0YWJpbmRpbmcsIGRhdGFiaW5kaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEZyb250ZW5kIGdldEZyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gZnJvbnRlbmQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RnJvbnRlbmQoRnJvbnRlbmQgbmV3RnJvbnRlbmQpIHsKLSAgICAgICAgRnJvbnRlbmQgb2xkRnJvbnRlbmQgPSBmcm9udGVuZDsKLSAgICAgICAgZnJvbnRlbmQgPSBuZXdGcm9udGVuZCA9PSBudWxsID8gRlJPTlRFTkRfRURFRkFVTFQgOiBuZXdGcm9udGVuZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQsIG9sZEZyb250ZW5kLCBmcm9udGVuZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChib29sZWFuIG5ld1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICBib29sZWFuIG9sZFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCA9IHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0ID0gbmV3VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQsIG9sZFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCwgdXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKSB7Ci0gICAgICAgIHJldHVybiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKGJvb2xlYW4gbmV3RXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyID0gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyOwotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIgPSBuZXdFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXI7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUiwgb2xkRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyLCBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gZ2V0SW5zdGFsbGF0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbGxhdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5zdGFsbGF0aW9ucyhNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiBuZXdJbnN0YWxsYXRpb25zKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IG9sZEluc3RhbGxhdGlvbnMgPSBpbnN0YWxsYXRpb25zOwotICAgICAgICBpbnN0YWxsYXRpb25zID0gbmV3SW5zdGFsbGF0aW9uczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUywgb2xkSW5zdGFsbGF0aW9ucywgaW5zdGFsbGF0aW9ucykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgbmV3UHJvamVjdE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgICAgIHByb2plY3ROYW1lID0gbmV3UHJvamVjdE5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSwgb2xkUHJvamVjdE5hbWUsIHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIHJlc291cmNlRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRGlyZWN0b3J5KFN0cmluZyBuZXdSZXNvdXJjZURpcmVjdG9yeSkgewotICAgICAgICBTdHJpbmcgb2xkUmVzb3VyY2VEaXJlY3RvcnkgPSByZXNvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgcmVzb3VyY2VEaXJlY3RvcnkgPSBuZXdSZXNvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZLCBvbGRSZXNvdXJjZURpcmVjdG9yeSwgcmVzb3VyY2VEaXJlY3RvcnkpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gY2xhc3NEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2xhc3NEaXJlY3RvcnkoU3RyaW5nIG5ld0NsYXNzRGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZyBvbGRDbGFzc0RpcmVjdG9yeSA9IGNsYXNzRGlyZWN0b3J5OwotICAgICAgICBjbGFzc0RpcmVjdG9yeSA9IG5ld0NsYXNzRGlyZWN0b3J5OwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlksIG9sZENsYXNzRGlyZWN0b3J5LCBjbGFzc0RpcmVjdG9yeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V3NkbEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFdzZGxGaWxlTmFtZShTdHJpbmcgbmV3V3NkbEZpbGVOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRXc2RsRmlsZU5hbWUgPSB3c2RsRmlsZU5hbWU7Ci0gICAgICAgIHdzZGxGaWxlTmFtZSA9IG5ld1dzZGxGaWxlTmFtZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUUsIG9sZFdzZGxGaWxlTmFtZSwgd3NkbEZpbGVOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFVSTCBnZXRXc2RsVVJMKCkgewotICAgICAgICByZXR1cm4gd3NkbFVSTDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsVVJMKFVSTCBuZXdXc2RsVVJMKSB7Ci0gICAgICAgIFVSTCBvbGRXc2RsVVJMID0gd3NkbFVSTDsKLSAgICAgICAgd3NkbFVSTCA9IG5ld1dzZGxVUkw7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfVVJMLCBvbGRXc2RsVVJMLCB3c2RsVVJMKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb25maWdXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBjb25maWdXc2RsTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29uZmlnV3NkbExvY2F0aW9uKFN0cmluZyBuZXdDb25maWdXc2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9sZENvbmZpZ1dzZGxMb2NhdGlvbiA9IGNvbmZpZ1dzZGxMb2NhdGlvbjsKLSAgICAgICAgY29uZmlnV3NkbExvY2F0aW9uID0gbmV3Q29uZmlnV3NkbExvY2F0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTiwgb2xkQ29uZmlnV3NkbExvY2F0aW9uLCBjb25maWdXc2RsTG9jYXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoU3RyaW5nIG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lID0gZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lOwotICAgICAgICBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUgPSBuZXdGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUsIG9sZEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSwgZnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKFN0cmluZyBuZXdGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSB7Ci0gICAgICAgIFN0cmluZyBvbGRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lID0gZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTsKLSAgICAgICAgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IG5ld0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FLCBvbGRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lLCBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb25maWdJZCgpIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ0lkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENvbmZpZ0lkKFN0cmluZyBuZXdDb25maWdJZCkgewotICAgICAgICBTdHJpbmcgb2xkQ29uZmlnSWQgPSBjb25maWdJZDsKLSAgICAgICAgY29uZmlnSWQgPSBuZXdDb25maWdJZDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lELCBvbGRDb25maWdJZCwgY29uZmlnSWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgewotICAgICAgICBTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBuZXdUYXJnZXROYW1lc3BhY2U7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UsIG9sZFRhcmdldE5hbWVzcGFjZSwgdGFyZ2V0TmFtZXNwYWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbmRwb2ludE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBlbmRwb2ludE5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnROYW1lKFN0cmluZyBuZXdFbmRwb2ludE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZEVuZHBvaW50TmFtZSA9IGVuZHBvaW50TmFtZTsKLSAgICAgICAgZW5kcG9pbnROYW1lID0gbmV3RW5kcG9pbnROYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FLCBvbGRFbmRwb2ludE5hbWUsIGVuZHBvaW50TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgbmV3U2VydmljZU5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIHNlcnZpY2VOYW1lID0gbmV3U2VydmljZU5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSwgb2xkU2VydmljZU5hbWUsIHNlcnZpY2VOYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIERlZmluaXRpb24gZ2V0V3NkbERlZmluaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiB3c2RsRGVmaW5pdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRGVmaW5pdGlvbihEZWZpbml0aW9uIG5ld1dzZGxEZWZpbml0aW9uKSB7Ci0gICAgICAgIERlZmluaXRpb24gb2xkV3NkbERlZmluaXRpb24gPSB3c2RsRGVmaW5pdGlvbjsKLSAgICAgICAgd3NkbERlZmluaXRpb24gPSBuZXdXc2RsRGVmaW5pdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OLCBvbGRXc2RsRGVmaW5pdGlvbiwgd3NkbERlZmluaXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHdzZGxMb2NhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIG5ld1dzZGxMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkV3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uOwotICAgICAgICB3c2RsTG9jYXRpb24gPSBuZXdXc2RsTG9jYXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT04sIG9sZFdzZGxMb2NhdGlvbiwgd3NkbExvY2F0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRSdW50aW1lTG9jYXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRSdW50aW1lVHlwZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmVyYm9zZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZUFudEJ1aWxkRmlsZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVDbGllbnQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlU2VydmVyKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXREYXRhYmluZGluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GUk9OVEVORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RnJvbnRlbmQoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0lOU1RBTExBVElPTlM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEluc3RhbGxhdGlvbnMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUFJPSkVDVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFJlc291cmNlRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9GSUxFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxGaWxlTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX1VSTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0V3NkbFVSTCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DT05GSUdfSUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbmZpZ0lkKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRFbmRwb2ludE5hbWUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFdzZGxMb2NhdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICBzZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU6Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1ZFUlNJT046Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVkVSQk9TRToKLSAgICAgICAgICAgICAgICBzZXRWZXJib3NlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlQW50QnVpbGRGaWxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0NMSUVOVDoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUNsaWVudCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9TRVJWRVI6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVTZXJ2ZXIoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0RGF0YWJpbmRpbmcoKERhdGFCaW5kaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZST05URU5EOgotICAgICAgICAgICAgICAgIHNldEZyb250ZW5kKChGcm9udGVuZCluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICBzZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzoKLSAgICAgICAgICAgICAgICBzZXRJbnN0YWxsYXRpb25zKChNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0UHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19SRVNPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0UmVzb3VyY2VEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NEaXJlY3RvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRXc2RsRmlsZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX1VSTDoKLSAgICAgICAgICAgICAgICBzZXRXc2RsVVJMKChVUkwpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0Q29uZmlnV3NkbExvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlVMTFlfUVVBTElGSUVEX0pBVkFfQ0xBU1NfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOgotICAgICAgICAgICAgICAgIHNldENvbmZpZ0lkKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVEFSR0VUX05BTUVTUEFDRToKLSAgICAgICAgICAgICAgICBzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19FTkRQT0lOVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldEVuZHBvaW50TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRTZXJ2aWNlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfREVGSU5JVElPTjoKLSAgICAgICAgICAgICAgICBzZXRXc2RsRGVmaW5pdGlvbigoRGVmaW5pdGlvbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihERUZBVUxUX1JVTlRJTUVfTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREVGQVVMVF9SVU5USU1FX1RZUEU6Ci0gICAgICAgICAgICAgICAgc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKERFRkFVTFRfUlVOVElNRV9UWVBFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldERlZmF1bHRSdW50aW1lVmVyc2lvbihERUZBVUxUX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19WRVJCT1NFOgotICAgICAgICAgICAgICAgIHNldFZlcmJvc2UoVkVSQk9TRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZUFudEJ1aWxkRmlsZShHRU5FUkFURV9BTlRfQlVJTERfRklMRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVDbGllbnQoR0VORVJBVEVfQ0xJRU5UX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1NFUlZFUjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVNlcnZlcihHRU5FUkFURV9TRVJWRVJfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fREFUQUJJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0RGF0YWJpbmRpbmcoREFUQUJJTkRJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgc2V0RnJvbnRlbmQoRlJPTlRFTkRfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIHNldFVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dChVU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFRfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRVhQT1JUX0NYRl9DTEFTU1BBVEhfQ09OVEFJTkVSOgotICAgICAgICAgICAgICAgIHNldEV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcihFWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzoKLSAgICAgICAgICAgICAgICBzZXRJbnN0YWxsYXRpb25zKChNYXA8U3RyaW5nLCBDWEZJbnN0YWxsPiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TmFtZShQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldFJlc291cmNlRGlyZWN0b3J5KFJFU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NEaXJlY3RvcnkoQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFdzZGxGaWxlTmFtZShXU0RMX0ZJTEVfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX1VSTDoKLSAgICAgICAgICAgICAgICBzZXRXc2RsVVJMKFdTRExfVVJMX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHNldENvbmZpZ1dzZGxMb2NhdGlvbihDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19GVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZShGVUxMWV9RVUFMSUZJRURfSkFWQV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoRlVMTFlfUVVBTElGSUVEX0pBVkFfSU5URVJGQUNFX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOgotICAgICAgICAgICAgICAgIHNldENvbmZpZ0lkKENPTkZJR19JRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19UQVJHRVRfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU6Ci0gICAgICAgICAgICAgICAgc2V0RW5kcG9pbnROYW1lKEVORFBPSU5UX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fU0VSVklDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFNlcnZpY2VOYW1lKFNFUlZJQ0VfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbERlZmluaXRpb24oV1NETF9ERUZJTklUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1dTRExfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0V3NkbExvY2F0aW9uKFdTRExfTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19ERUZBVUxUX1JVTlRJTUVfTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiAhPSBudWxsIDogIURFRkFVTFRfUlVOVElNRV9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX1JVTlRJTUVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFJ1bnRpbWVUeXBlICE9IG51bGwgOiAhREVGQVVMVF9SVU5USU1FX1RZUEVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRSdW50aW1lVHlwZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RFRkFVTFRfUlVOVElNRV9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBERUZBVUxUX1JVTlRJTUVfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gZGVmYXVsdFJ1bnRpbWVWZXJzaW9uICE9IG51bGwgOiAhREVGQVVMVF9SVU5USU1FX1ZFUlNJT05fRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZlcmJvc2UgIT0gVkVSQk9TRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfQU5UX0JVSUxEX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQW50QnVpbGRGaWxlICE9IEdFTkVSQVRFX0FOVF9CVUlMRF9GSUxFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19HRU5FUkFURV9DTElFTlQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlQ2xpZW50ICE9IEdFTkVSQVRFX0NMSUVOVF9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVNlcnZlciAhPSBHRU5FUkFURV9TRVJWRVJfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0RBVEFCSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBkYXRhYmluZGluZyAhPSBEQVRBQklORElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fRlJPTlRFTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZyb250ZW5kICE9IEZST05URU5EX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCAhPSBVU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFRfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyICE9IEVYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fSU5TVEFMTEFUSU9OUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbGF0aW9ucyAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19QUk9KRUNUX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE5hbWUgIT0gbnVsbCA6ICFQUk9KRUNUX05BTUVfRURFRkFVTFQuZXF1YWxzKHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlRGlyZWN0b3J5ICE9IG51bGwgOiAhUkVTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NMQVNTX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0xBU1NfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBjbGFzc0RpcmVjdG9yeSAhPSBudWxsIDogIUNMQVNTX0RJUkVDVE9SWV9FREVGQVVMVC5lcXVhbHMoY2xhc3NEaXJlY3RvcnkpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0ZJTEVfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9GSUxFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxGaWxlTmFtZSAhPSBudWxsIDogIVdTRExfRklMRV9OQU1FX0VERUZBVUxULmVxdWFscyh3c2RsRmlsZU5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX1VSTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9VUkxfRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxVUkwgIT0gbnVsbCA6ICFXU0RMX1VSTF9FREVGQVVMVC5lcXVhbHMod3NkbFVSTCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0NPTkZJR19XU0RMX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBDT05GSUdfV1NETF9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gY29uZmlnV3NkbExvY2F0aW9uICE9IG51bGwgOiAhQ09ORklHX1dTRExfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGNvbmZpZ1dzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSAhPSBudWxsIDogIUZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBGVUxMWV9RVUFMSUZJRURfSkFWQV9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSAhPSBudWxsIDogIUZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxULmVxdWFscyhmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fQ09ORklHX0lEOgotICAgICAgICAgICAgICAgIHJldHVybiBDT05GSUdfSURfRURFRkFVTFQgPT0gbnVsbCA/IGNvbmZpZ0lkICE9IG51bGwgOiAhQ09ORklHX0lEX0VERUZBVUxULmVxdWFscyhjb25maWdJZCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVORFBPSU5UX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVuZHBvaW50TmFtZSAhPSBudWxsIDogIUVORFBPSU5UX05BTUVfRURFRkFVTFQuZXF1YWxzKGVuZHBvaW50TmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gU0VSVklDRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZXJ2aWNlTmFtZSAhPSBudWxsIDogIVNFUlZJQ0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VydmljZU5hbWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9EQVRBX01PREVMX19XU0RMX0RFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFdTRExfREVGSU5JVElPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbERlZmluaXRpb24gIT0gbnVsbCA6ICFXU0RMX0RFRklOSVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfREFUQV9NT0RFTF9fV1NETF9MT0NBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gV1NETF9MT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gd3NkbExvY2F0aW9uICE9IG51bGwgOiAhV1NETF9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMod3NkbExvY2F0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgKGRlZmF1bHRSdW50aW1lTG9jYXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGRlZmF1bHRSdW50aW1lTG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRSdW50aW1lVHlwZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFJ1bnRpbWVUeXBlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0UnVudGltZVZlcnNpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGRlZmF1bHRSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdmVyYm9zZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodmVyYm9zZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVBbnRCdWlsZEZpbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlQW50QnVpbGRGaWxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZUNsaWVudDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVDbGllbnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlU2VydmVyOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVNlcnZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGF0YWJpbmRpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGRhdGFiaW5kaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmcm9udGVuZDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnJvbnRlbmQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHVzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXI6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaW5zdGFsbGF0aW9uczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5zdGFsbGF0aW9ucyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdE5hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZURpcmVjdG9yeTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQocmVzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNsYXNzRGlyZWN0b3J5OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjbGFzc0RpcmVjdG9yeSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbEZpbGVOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh3c2RsRmlsZU5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHdzZGxVUkw6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxVUkwpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbmZpZ1dzZGxMb2NhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY29uZmlnV3NkbExvY2F0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBmdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29uZmlnSWQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGNvbmZpZ0lkKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXROYW1lc3BhY2U6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZW5kcG9pbnROYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChlbmRwb2ludE5hbWUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbERlZmluaXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxEZWZpbml0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB3c2RsTG9jYXRpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotfSAvL0NYRkRhdGFNb2RlbEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9DWEZGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2M2MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZGYWN0b3J5SW1wbC5qYXZhLHYgMS4yIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQ1hGRmFjdG9yeSB7Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ1hGRmFjdG9yeSBpbml0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ1hGRmFjdG9yeSB0aGVDWEZGYWN0b3J5ID0gKENYRkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsLmVjb3JlIik7IAotICAgICAgICAgICAgaWYgKHRoZUNYRkZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGVDWEZGYWN0b3J5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICBFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IENYRkZhY3RvcnlJbXBsKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGRmFjdG9yeUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLSAgICAgICAgc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlSmF2YTJXU0RhdGFNb2RlbCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ1hGSW5zdGFsbCgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5GUk9OVEVORDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRnJvbnRlbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5EQVRBX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURhdGFCaW5kaW5nRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuVVJMOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVVUkxGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5ERUZJTklUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEZWZpbml0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVNYXBGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5JTUVUSE9EOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJTWV0aG9kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICBzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkZST05URU5EOgotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0RnJvbnRlbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRBVEFfQklORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydERhdGFCaW5kaW5nVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5VUkw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRVUkxUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkRFRklOSVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnREZWZpbml0aW9uVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRNYXBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLklNRVRIT0Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRJTWV0aG9kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBKYXZhMldTRGF0YU1vZGVsIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKSB7Ci0gICAgICAgIEphdmEyV1NEYXRhTW9kZWxJbXBsIGphdmEyV1NEYXRhTW9kZWwgPSBuZXcgSmF2YTJXU0RhdGFNb2RlbEltcGwoKTsKLSAgICAgICAgcmV0dXJuIGphdmEyV1NEYXRhTW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFdTREwySmF2YURhdGFNb2RlbCBjcmVhdGVXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIFdTREwySmF2YURhdGFNb2RlbEltcGwgd3NkbDJKYXZhRGF0YU1vZGVsID0gbmV3IFdTREwySmF2YURhdGFNb2RlbEltcGwoKTsKLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YURhdGFNb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGSW5zdGFsbCBjcmVhdGVDWEZJbnN0YWxsKCkgewotICAgICAgICBDWEZJbnN0YWxsSW1wbCBjeGZJbnN0YWxsID0gbmV3IENYRkluc3RhbGxJbXBsKCk7Ci0gICAgICAgIHJldHVybiBjeGZJbnN0YWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBGcm9udGVuZCBjcmVhdGVGcm9udGVuZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICBGcm9udGVuZCByZXN1bHQgPSBGcm9udGVuZC5nZXQoaW5pdGlhbFZhbHVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0RnJvbnRlbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRGF0YUJpbmRpbmcgY3JlYXRlRGF0YUJpbmRpbmdGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgRGF0YUJpbmRpbmcgcmVzdWx0ID0gRGF0YUJpbmRpbmcuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydERhdGFCaW5kaW5nVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFVSTCBjcmVhdGVVUkxGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChVUkwpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0VVJMVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBEZWZpbml0aW9uIGNyZWF0ZURlZmluaXRpb25Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChEZWZpbml0aW9uKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydERlZmluaXRpb25Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotICAgICAgICByZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDw/LCA/PiBjcmVhdGVNYXBGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIChNYXA8PywgPz4pc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhpbml0aWFsVmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29udmVydE1hcFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoaW5zdGFuY2VWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIElNZXRob2QgY3JlYXRlSU1ldGhvZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotICAgICAgICByZXR1cm4gKElNZXRob2Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb252ZXJ0SU1ldGhvZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGUGFja2FnZSBnZXRDWEZQYWNrYWdlKCkgewotICAgICAgICByZXR1cm4gKENYRlBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBkZXByZWNhdGVkCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBDWEZQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0gICAgICAgIHJldHVybiBDWEZQYWNrYWdlLmVJTlNUQU5DRTsKLSAgICB9Ci0KLX0gLy9DWEZGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRkluc3RhbGxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGSW5zdGFsbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjMjgxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGSW5zdGFsbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IENYRkluc3RhbGxJbXBsLmphdmEsdiAxLjEgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluc3RhbGw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkNYRkluc3RhbGxJbXBsI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuQ1hGSW5zdGFsbEltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENYRkluc3RhbGxJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDWEZJbnN0YWxsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRWZXJzaW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0TG9jYXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRMb2NhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0VHlwZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFR5cGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ1hGSW5zdGFsbEltcGwoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0gICAgICAgIHJldHVybiBDWEZQYWNrYWdlLkxpdGVyYWxzLkNYRl9JTlNUQUxMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotICAgICAgICBTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIHZlcnNpb24gPSBuZXdWZXJzaW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewotICAgICAgICBTdHJpbmcgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgICAgICAgbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fTE9DQVRJT04sIG9sZExvY2F0aW9uLCBsb2NhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotICAgICAgICBTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0gICAgICAgIHR5cGUgPSBuZXdUeXBlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRUeXBlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0TG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19UWVBFOgotICAgICAgICAgICAgICAgIHNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVkVSU0lPTjoKLSAgICAgICAgICAgICAgICBzZXRWZXJzaW9uKFZFUlNJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fTE9DQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTF9fVFlQRToKLSAgICAgICAgICAgICAgICBzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0lOU1RBTExfX0xPQ0FUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkNYRl9JTlNUQUxMX19UWVBFOgotICAgICAgICAgICAgICAgIHJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBsb2NhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHR5cGUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLX0gLy9DWEZJbnN0YWxsSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0NYRlBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE5MDQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvQ1hGUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZQYWNrYWdlSW1wbC5qYXZhLHYgMS42IDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVHZW5lcmljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDWEZQYWNrYWdlIHsKLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBjeGZDb250ZXh0RUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGN4ZkRhdGFNb2RlbEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBqYXZhMldTQ29udGV4dEVDbGFzcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVDbGFzcyBqYXZhMldTRGF0YU1vZGVsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIHdzZGwySmF2YUNvbnRleHRFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFQ2xhc3Mgd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUNsYXNzIGN4Zkluc3RhbGxFQ2xhc3MgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRW51bSBmcm9udGVuZEVFbnVtID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgRUVudW0gZGF0YUJpbmRpbmdFRW51bSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSB1cmxFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgZGVmaW5pdGlvbkVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIEVEYXRhVHlwZSBtYXBFRGF0YVR5cGUgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBFRGF0YVR5cGUgaU1ldGhvZEVEYXRhVHlwZSA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0gICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLSAgICAgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLSAgICAgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0gICAgICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLSAgICAgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotICAgICAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZSNlTlNfVVJJCi0gICAgICogQHNlZSAjaW5pdCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByaXZhdGUgQ1hGUGFja2FnZUltcGwoKSB7Ci0gICAgICAgIHN1cGVyKGVOU19VUkksIENYRkZhY3RvcnkuZUlOU1RBTkNFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0gICAgICogCi0gICAgICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBDWEZQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotICAgICAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNlTlNfVVJJCi0gICAgICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLSAgICAgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZQYWNrYWdlIGluaXQoKSB7Ci0gICAgICAgIGlmIChpc0luaXRlZCkgcmV0dXJuIChDWEZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENYRlBhY2thZ2UuZU5TX1VSSSk7Ci0KLSAgICAgICAgLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotICAgICAgICBDWEZQYWNrYWdlSW1wbCB0aGVDWEZQYWNrYWdlID0gKENYRlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBDWEZQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBDWEZQYWNrYWdlSW1wbCgpKTsKLQotICAgICAgICBpc0luaXRlZCA9IHRydWU7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLSAgICAgICAgdGhlQ1hGUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotICAgICAgICAvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0gICAgICAgIHRoZUNYRlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0gICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLSAgICAgICAgdGhlQ1hGUGFja2FnZS5mcmVlemUoKTsKLQotICAKLSAgICAgICAgLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0gICAgICAgIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChDWEZQYWNrYWdlLmVOU19VUkksIHRoZUNYRlBhY2thZ2UpOwotICAgICAgICByZXR1cm4gdGhlQ1hGUGFja2FnZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldENYRkNvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBjeGZDb250ZXh0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X1ZlcmJvc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0dlbmVyYXRlQ2xpZW50KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGQ29udGV4dF9EYXRhYmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0Zyb250ZW5kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkNvbnRleHRfRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZDb250ZXh0X0luc3RhbGxhdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0Q1hGRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gY3hmRGF0YU1vZGVsRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Qcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9SZXNvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9DbGFzc0RpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsRmlsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfV3NkbFVSTCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Db25maWdXc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfRnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfQ29uZmlnSWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfVGFyZ2V0TmFtZXNwYWNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4ZkRhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q1hGRGF0YU1vZGVsX1dzZGxEZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkRhdGFNb2RlbF9Xc2RsTG9jYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSljeGZEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRKYXZhMldTQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmEyV1NDb250ZXh0RUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X1NvYXAxMkJpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXU0RMKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9Bbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0SmF2YTJXU0RhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmEyV1NEYXRhTW9kZWxFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9DbGFzc3BhdGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9KYXZhU3RhcnRpbmdQb2ludCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX0V4dHJhY3RJbnRlcmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YTJXU0RhdGFNb2RlbF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfTWV0aG9kTWFwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldEphdmEyV1NEYXRhTW9kZWxfQW5ub3RhdGlvbk1hcCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1NvdXJjZURpcmVjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWphdmEyV1NEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhMldTRGF0YU1vZGVsX1BvcnROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpamF2YTJXU0RhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0V1NETDJKYXZhQ29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YUNvbnRleHRFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9HZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfUHJvY2Vzc1NPQVBIZWFkZXJzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfV3NkbFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9Vc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjQXJncygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNVc2VEZWZhdWx0VmFsdWVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjVG9TdHJpbmdTaW1wbGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFDb250ZXh0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YUNvbnRleHRfWGpjTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhQ29udGV4dF9YamNNYXJrR2VuZXJhdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X1hqY0VwaXNvZGVGaWxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhQ29udGV4dEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFDb250ZXh0X0F1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVDbGFzcyBnZXRXU0RMMkphdmFEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0luY2x1ZGVkTmFtZXNwYWNlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKXdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFdTREwySmF2YURhdGFNb2RlbF9CaW5kaW5nRmlsZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXU0RMMkphdmFEYXRhTW9kZWxfRXhjbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0NhdGFsb2dGaWxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpd3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVBdHRyaWJ1dGUgZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSl3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldENYRkluc3RhbGwoKSB7Ci0gICAgICAgIHJldHVybiBjeGZJbnN0YWxsRUNsYXNzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfVmVyc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4Zkluc3RhbGxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDWEZJbnN0YWxsX0xvY2F0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpY3hmSW5zdGFsbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldENYRkluc3RhbGxfVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWN4Zkluc3RhbGxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRUVudW0gZ2V0RnJvbnRlbmQoKSB7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZEVFbnVtOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBFRW51bSBnZXREYXRhQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIGRhdGFCaW5kaW5nRUVudW07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXRVUkwoKSB7Ci0gICAgICAgIHJldHVybiB1cmxFRGF0YVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEVEYXRhVHlwZSBnZXREZWZpbml0aW9uKCkgewotICAgICAgICByZXR1cm4gZGVmaW5pdGlvbkVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldE1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1hcEVEYXRhVHlwZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRURhdGFUeXBlIGdldElNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiBpTWV0aG9kRURhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZGYWN0b3J5IGdldENYRkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoQ1hGRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0gICAgICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotICAgICAgICBpc0NyZWF0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotICAgICAgICBjeGZDb250ZXh0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENYRl9DT05URVhUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fREVGQVVMVF9SVU5USU1FX1RZUEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19ERUZBVUxUX1JVTlRJTUVfVkVSU0lPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX1ZFUkJPU0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0NMSUVOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmQ29udGV4dEVDbGFzcywgQ1hGX0NPTlRFWFRfX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZDb250ZXh0RUNsYXNzLCBDWEZfQ09OVEVYVF9fRlJPTlRFTkQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19VU0VfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkNvbnRleHRFQ2xhc3MsIENYRl9DT05URVhUX19JTlNUQUxMQVRJT05TKTsKLQotICAgICAgICBjeGZEYXRhTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1hGX0RBVEFfTU9ERUwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1BST0pFQ1RfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fUkVTT1VSQ0VfRElSRUNUT1JZKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19DTEFTU19ESVJFQ1RPUlkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1dTRExfRklMRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19XU0RMX1VSTCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fQ09ORklHX1dTRExfTE9DQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0NMQVNTX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0ZVTExZX1FVQUxJRklFRF9KQVZBX0lOVEVSRkFDRV9OQU1FKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19DT05GSUdfSUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1RBUkdFVF9OQU1FU1BBQ0UpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX0VORFBPSU5UX05BTUUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGN4ZkRhdGFNb2RlbEVDbGFzcywgQ1hGX0RBVEFfTU9ERUxfX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmRGF0YU1vZGVsRUNsYXNzLCBDWEZfREFUQV9NT0RFTF9fV1NETF9ERUZJTklUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRl9EQVRBX01PREVMX19XU0RMX0xPQ0FUSU9OKTsKLQotICAgICAgICBqYXZhMldTQ29udGV4dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBMl9XU19DT05URVhUKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dTREwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NDb250ZXh0RUNsYXNzLCBKQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTQ29udGV4dEVDbGFzcywgSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OKTsKLQotICAgICAgICBqYXZhMldTRGF0YU1vZGVsRUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkEyX1dTX0RBVEFfTU9ERUwpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShqYXZhMldTRGF0YU1vZGVsRUNsYXNzLCBKQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVApOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlkpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKGphdmEyV1NEYXRhTW9kZWxFQ2xhc3MsIEpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRSk7Ci0KLSAgICAgICAgd3NkbDJKYXZhQ29udGV4dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMMl9KQVZBX0NPTlRFWFQpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT04pOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEUpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fV1NETF9WRVJTSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfQVJHUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19OT19BRERSRVNTX0JJTkRJTkcpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YUNvbnRleHRFQ2xhc3MsIFdTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfU1lOQ19NRVRIT0RTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhQ29udGV4dEVDbGFzcywgV1NETDJfSkFWQV9DT05URVhUX19YSkNfRVBJU09ERV9GSUxFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKTsKLQotICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV1NETDJfSkFWQV9EQVRBX01PREVMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUyk7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVMpOwotICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcywgV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZSh3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MsIFdTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSKTsKLQotICAgICAgICBjeGZJbnN0YWxsRUNsYXNzID0gY3JlYXRlRUNsYXNzKENYRl9JTlNUQUxMKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZJbnN0YWxsRUNsYXNzLCBDWEZfSU5TVEFMTF9fVkVSU0lPTik7Ci0gICAgICAgIGNyZWF0ZUVBdHRyaWJ1dGUoY3hmSW5zdGFsbEVDbGFzcywgQ1hGX0lOU1RBTExfX0xPQ0FUSU9OKTsKLSAgICAgICAgY3JlYXRlRUF0dHJpYnV0ZShjeGZJbnN0YWxsRUNsYXNzLCBDWEZfSU5TVEFMTF9fVFlQRSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGVudW1zCi0gICAgICAgIGZyb250ZW5kRUVudW0gPSBjcmVhdGVFRW51bShGUk9OVEVORCk7Ci0gICAgICAgIGRhdGFCaW5kaW5nRUVudW0gPSBjcmVhdGVFRW51bShEQVRBX0JJTkRJTkcpOwotCi0gICAgICAgIC8vIENyZWF0ZSBkYXRhIHR5cGVzCi0gICAgICAgIHVybEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShVUkwpOwotICAgICAgICBkZWZpbml0aW9uRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERFRklOSVRJT04pOwotICAgICAgICBtYXBFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoTUFQKTsKLSAgICAgICAgaU1ldGhvZEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTUVUSE9EKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLSAgICAgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgcGFja2FnZQotICAgICAgICBzZXROYW1lKGVOQU1FKTsKLSAgICAgICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0gICAgICAgIHNldE5zVVJJKGVOU19VUkkpOwotCi0gICAgICAgIC8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLSAgICAgICAgYWRkRVR5cGVQYXJhbWV0ZXIobWFwRURhdGFUeXBlLCAiVCIpOwotICAgICAgICBhZGRFVHlwZVBhcmFtZXRlcihtYXBFRGF0YVR5cGUsICJUMSIpOwotCi0gICAgICAgIC8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0gICAgICAgIC8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLSAgICAgICAgY3hmRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGQ29udGV4dCgpKTsKLSAgICAgICAgamF2YTJXU0NvbnRleHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDWEZDb250ZXh0KCkpOwotICAgICAgICBqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q1hGRGF0YU1vZGVsKCkpOwotICAgICAgICBqYXZhMldTRGF0YU1vZGVsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SmF2YTJXU0NvbnRleHQoKSk7Ci0gICAgICAgIHdzZGwySmF2YUNvbnRleHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDWEZDb250ZXh0KCkpOwotICAgICAgICB3c2RsMkphdmFEYXRhTW9kZWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDWEZEYXRhTW9kZWwoKSk7Ci0gICAgICAgIHdzZGwySmF2YURhdGFNb2RlbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdTREwySmF2YUNvbnRleHQoKSk7Ci0KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLSAgICAgICAgaW5pdEVDbGFzcyhjeGZDb250ZXh0RUNsYXNzLCBDWEZDb250ZXh0LmNsYXNzLCAiQ1hGQ29udGV4dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVmYXVsdFJ1bnRpbWVMb2NhdGlvbiIsIG51bGwsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfRGVmYXVsdFJ1bnRpbWVUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWZhdWx0UnVudGltZVR5cGUiLCBudWxsLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0RlZmF1bHRSdW50aW1lVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVmYXVsdFJ1bnRpbWVWZXJzaW9uIiwgbnVsbCwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidmVyYm9zZSIsICJ0cnVlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUFudEJ1aWxkRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlQW50QnVpbGRGaWxlIiwgImZhbHNlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZUNsaWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlQ2xpZW50IiwgImZhbHNlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9HZW5lcmF0ZVNlcnZlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlU2VydmVyIiwgImZhbHNlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9EYXRhYmluZGluZygpLCB0aGlzLmdldERhdGFCaW5kaW5nKCksICJkYXRhYmluZGluZyIsICJqYXhiIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGQ29udGV4dF9Gcm9udGVuZCgpLCB0aGlzLmdldEZyb250ZW5kKCksICJmcm9udGVuZCIsICJqYXh3cyIsIDAsIDEsIENYRkNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0IiwgInRydWUiLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lciIsICJ0cnVlIiwgMCwgMSwgQ1hGQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgRUdlbmVyaWNUeXBlIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFTWFwKCkpOwotICAgICAgICBFR2VuZXJpY1R5cGUgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRDWEZJbnN0YWxsKCkpOwotICAgICAgICBnMS5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMik7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkNvbnRleHRfSW5zdGFsbGF0aW9ucygpLCBnMSwgImluc3RhbGxhdGlvbnMiLCBudWxsLCAwLCAxLCBDWEZDb250ZXh0LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhjeGZEYXRhTW9kZWxFQ2xhc3MsIENYRkRhdGFNb2RlbC5jbGFzcywgIkNYRkRhdGFNb2RlbCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfUHJvamVjdE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb2plY3ROYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfUmVzb3VyY2VEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlRGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfQ2xhc3NEaXJlY3RvcnkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzRGlyZWN0b3J5IiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbEZpbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZU5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Xc2RsVVJMKCksIHRoaXMuZ2V0VVJMKCksICJ3c2RsVVJMIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfQ29uZmlnV3NkbExvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25maWdXc2RsTG9jYXRpb24iLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9GdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0Z1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9Db25maWdJZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29uZmlnSWQiLCBudWxsLCAwLCAxLCBDWEZEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldENYRkRhdGFNb2RlbF9UYXJnZXROYW1lc3BhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhcmdldE5hbWVzcGFjZSIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX0VuZHBvaW50TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZW5kcG9pbnROYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfU2VydmljZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VOYW1lIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZEYXRhTW9kZWxfV3NkbERlZmluaXRpb24oKSwgdGhpcy5nZXREZWZpbml0aW9uKCksICJ3c2RsRGVmaW5pdGlvbiIsIG51bGwsIDAsIDEsIENYRkRhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGRGF0YU1vZGVsX1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ1hGRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoamF2YTJXU0NvbnRleHRFQ2xhc3MsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAiSmF2YTJXU0NvbnRleHQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9Tb2FwMTJCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic29hcDEyQmluZGluZyIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVhTREltcG9ydHMoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVhTREltcG9ydHMiLCAidHJ1ZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdTREwiLCAidHJ1ZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyIsICJ0cnVlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24iLCAiZmFsc2UiLCAwLCAxLCBKYXZhMldTQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIiwgImZhbHNlIiwgMCwgMSwgSmF2YTJXU0NvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbiIsICJmYWxzZSIsIDAsIDEsIEphdmEyV1NDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3MoamF2YTJXU0RhdGFNb2RlbEVDbGFzcywgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIkphdmEyV1NEYXRhTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfQ2xhc3NwYXRoKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc3BhdGgiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX0phdmFTdGFydGluZ1BvaW50KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhU3RhcnRpbmdQb2ludCIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgSmF2YTJXU0RhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9FeHRyYWN0SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZXh0cmFjdEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldElNZXRob2QoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUodGhpcy5nZXRNYXAoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgRUdlbmVyaWNUeXBlIGczID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCkpOwotICAgICAgICBnMi5nZXRFVHlwZUFyZ3VtZW50cygpLmFkZChnMyk7Ci0gICAgICAgIGczID0gY3JlYXRlRUdlbmVyaWNUeXBlKGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpKTsKLSAgICAgICAgZzIuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzMpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX01ldGhvZE1hcCgpLCBnMSwgIm1ldGhvZE1hcCIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW5PYmplY3QoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YTJXU0RhdGFNb2RlbF9Bbm5vdGF0aW9uTWFwKCksIGcxLCAiYW5ub3RhdGlvbk1hcCIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldEphdmEyV1NEYXRhTW9kZWxfU291cmNlRGlyZWN0b3J5KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2VEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBKYXZhMldTRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRKYXZhMldTRGF0YU1vZGVsX1BvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwb3J0TmFtZSIsIG51bGwsIDAsIDEsIEphdmEyV1NEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyh3c2RsMkphdmFDb250ZXh0RUNsYXNzLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAiV1NETDJKYXZhQ29udGV4dCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImdlbmVyYXRlSW1wbGVtZW50YXRpb24iLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfUHJvY2Vzc1NPQVBIZWFkZXJzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicHJvY2Vzc1NPQVBIZWFkZXJzIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nIiwgInRydWUiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciLCAidHJ1ZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfVmFsaWRhdGUoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ2YWxpZGF0ZSIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Xc2RsVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbFZlcnNpb24iLCAiMS4xIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Vc2VEZWZhdWx0VmFsdWVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidXNlRGVmYXVsdFZhbHVlcyIsICJ0cnVlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNBcmdzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ4amNBcmdzIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9Ob0FkZHJlc3NCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibm9BZGRyZXNzQmluZGluZyIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjVXNlRGVmYXVsdFZhbHVlcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY1VzZURlZmF1bHRWYWx1ZXMiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjVG9TdHJpbmciLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nTXVsdGlMaW5lKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjVG9TdHJpbmdNdWx0aUxpbmUiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjVG9TdHJpbmdTaW1wbGUiLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ4amNMb2NhdG9yIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhqY1N5bmNNZXRob2RzIiwgImZhbHNlIiwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9YamNNYXJrR2VuZXJhdGVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAieGpjTWFya0dlbmVyYXRlZCIsICJmYWxzZSIsIDAsIDEsIFdTREwySmF2YUNvbnRleHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0gICAgICAgIGluaXRFQXR0cmlidXRlKGdldFdTREwySmF2YUNvbnRleHRfWGpjRXBpc29kZUZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhqY0VwaXNvZGVGaWxlIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhQ29udGV4dC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhQ29udGV4dF9BdXRvTmFtZVJlc29sdXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhdXRvTmFtZVJlc29sdXRpb24iLCAiZmFsc2UiLCAwLCAxLCBXU0RMMkphdmFDb250ZXh0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIGluaXRFQ2xhc3Mod3NkbDJKYXZhRGF0YU1vZGVsRUNsYXNzLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICJXU0RMMkphdmFEYXRhTW9kZWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGcxID0gY3JlYXRlRUdlbmVyaWNUeXBlKHRoaXMuZ2V0TWFwKCkpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBnMiA9IGNyZWF0ZUVHZW5lcmljVHlwZShlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpKTsKLSAgICAgICAgZzEuZ2V0RVR5cGVBcmd1bWVudHMoKS5hZGQoZzIpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfSW5jbHVkZWROYW1lc3BhY2VzKCksIGcxLCAiaW5jbHVkZWROYW1lc3BhY2VzIiwgbnVsbCwgMCwgMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRXU0RMMkphdmFEYXRhTW9kZWxfQmluZGluZ0ZpbGVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJiaW5kaW5nRmlsZXMiLCBudWxsLCAwLCAtMSwgV1NETDJKYXZhRGF0YU1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBnMSA9IGNyZWF0ZUVHZW5lcmljVHlwZSh0aGlzLmdldE1hcCgpKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgZzIgPSBjcmVhdGVFR2VuZXJpY1R5cGUoZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSk7Ci0gICAgICAgIGcxLmdldEVUeXBlQXJndW1lbnRzKCkuYWRkKGcyKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0V4Y2x1ZGVkTmFtZXNwYWNlcygpLCBnMSwgImV4Y2x1ZGVkTmFtZXNwYWNlcyIsIG51bGwsIDAsIDEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0NhdGFsb2dGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjYXRhbG9nRmlsZSIsIG51bGwsIDAsIDEsIFdTREwySmF2YURhdGFNb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETDJKYXZhRGF0YU1vZGVsX0phdmFTb3VyY2VGb2xkZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImphdmFTb3VyY2VGb2xkZXIiLCBudWxsLCAwLCAxLCBXU0RMMkphdmFEYXRhTW9kZWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLSAgICAgICAgaW5pdEVDbGFzcyhjeGZJbnN0YWxsRUNsYXNzLCBDWEZJbnN0YWxsLmNsYXNzLCAiQ1hGSW5zdGFsbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGSW5zdGFsbF9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQ1hGSW5zdGFsbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLSAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0Q1hGSW5zdGFsbF9Mb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBDWEZJbnN0YWxsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotICAgICAgICBpbml0RUF0dHJpYnV0ZShnZXRDWEZJbnN0YWxsX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBDWEZJbnN0YWxsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0gICAgICAgIGluaXRFRW51bShmcm9udGVuZEVFbnVtLCBGcm9udGVuZC5jbGFzcywgIkZyb250ZW5kIik7Ci0gICAgICAgIGFkZEVFbnVtTGl0ZXJhbChmcm9udGVuZEVFbnVtLCBGcm9udGVuZC5KQVhXUyk7Ci0KLSAgICAgICAgaW5pdEVFbnVtKGRhdGFCaW5kaW5nRUVudW0sIERhdGFCaW5kaW5nLmNsYXNzLCAiRGF0YUJpbmRpbmciKTsKLSAgICAgICAgYWRkRUVudW1MaXRlcmFsKGRhdGFCaW5kaW5nRUVudW0sIERhdGFCaW5kaW5nLkpBWEIpOwotCi0gICAgICAgIC8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotICAgICAgICBpbml0RURhdGFUeXBlKHVybEVEYXRhVHlwZSwgamF2YS5uZXQuVVJMLmNsYXNzLCAiVVJMIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLSAgICAgICAgaW5pdEVEYXRhVHlwZShkZWZpbml0aW9uRURhdGFUeXBlLCBEZWZpbml0aW9uLmNsYXNzLCAiRGVmaW5pdGlvbiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0gICAgICAgIGluaXRFRGF0YVR5cGUobWFwRURhdGFUeXBlLCBNYXAuY2xhc3MsICJNYXAiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotICAgICAgICBpbml0RURhdGFUeXBlKGlNZXRob2RFRGF0YVR5cGUsIElNZXRob2QuY2xhc3MsICJJTWV0aG9kIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotICAgICAgICAvLyBDcmVhdGUgcmVzb3VyY2UKLSAgICAgICAgY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0gICAgfQotCi19IC8vQ1hGUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvaW1wbC9KYXZhMldTRGF0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0phdmEyV1NEYXRhTW9kZWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTc0Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL0phdmEyV1NEYXRhTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI0ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogSmF2YTJXU0RhdGFNb2RlbEltcGwuamF2YSx2IDEuMyAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YTIgV1MgRGF0YSBNb2RlbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNTb2FwMTJCaW5kaW5nIDxlbT5Tb2FwMTIgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVhTREltcG9ydHMgPGVtPkdlbmVyYXRlIFhTRCBJbXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlV1NETCA8ZW0+R2VuZXJhdGUgV1NETDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zIDxlbT5HZW5lcmF0ZSBXcmFwcGVyIEZhdWx0IEJlYW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2lzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24gPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uIDxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPGVtPkdlbmVyYXRlIFJlc3BvbnNlIFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuSmF2YTJXU0RhdGFNb2RlbEltcGwjZ2V0Q2xhc3NwYXRoIDxlbT5DbGFzc3BhdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldEphdmFTdGFydGluZ1BvaW50IDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNpc0V4dHJhY3RJbnRlcmZhY2UgPGVtPkV4dHJhY3QgSW50ZXJmYWNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRNZXRob2RNYXAgPGVtPk1ldGhvZCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldEFubm90YXRpb25NYXAgPGVtPkFubm90YXRpb24gTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5KYXZhMldTRGF0YU1vZGVsSW1wbCNnZXRTb3VyY2VEaXJlY3RvcnkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLkphdmEyV1NEYXRhTW9kZWxJbXBsI2dldFBvcnROYW1lIDxlbT5Qb3J0IE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhMldTRGF0YU1vZGVsSW1wbCBleHRlbmRzIENYRkRhdGFNb2RlbEltcGwgaW1wbGVtZW50cyBKYXZhMldTRGF0YU1vZGVsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTb2FwMTJCaW5kaW5nKCkgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1NvYXAxMkJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTT0FQMTJfQklORElOR19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTb2FwMTJCaW5kaW5nKCkgPGVtPlNvYXAxMiBCaW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1NvYXAxMkJpbmRpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHNvYXAxMkJpbmRpbmcgPSBTT0FQMTJfQklORElOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlWFNESW1wb3J0cygpIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9YU0RfSU1QT1JUU19FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlWFNESW1wb3J0cygpIDxlbT5HZW5lcmF0ZSBYU0QgSW1wb3J0czwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVhTREltcG9ydHMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlWFNESW1wb3J0cyA9IEdFTkVSQVRFX1hTRF9JTVBPUlRTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVXU0RMKCkgPGVtPkdlbmVyYXRlIFdTREw8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXU0RMKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfV1NETF9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV1NETCgpIDxlbT5HZW5lcmF0ZSBXU0RMPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV1NETCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVXU0RMID0gR0VORVJBVEVfV1NETF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOU19FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoKSA8ZW0+R2VuZXJhdGUgV3JhcHBlciBGYXVsdCBCZWFuczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zID0gR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIDxlbT5Bbm5vdGF0aW9uIFByb2Nlc3NpbmcgRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSA8ZW0+QW5ub3RhdGlvbiBQcm9jZXNzaW5nIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgPSBBTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBXZWIgTWV0aG9kIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gPSBHRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBXZWIgUGFyYW0gQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkgPGVtPkdlbmVyYXRlIFdlYiBQYXJhbSBBbm5vdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiA9IEdFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSA8ZW0+R2VuZXJhdGUgUmVxdWVzdCBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBSZXF1ZXN0IFdyYXBwZXIgQW5ub3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPSBHRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbigpIDxlbT5HZW5lcmF0ZSBSZXNwb25zZSBXcmFwcGVyIEFubm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPSBHRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NwYXRoKCkgPGVtPkNsYXNzcGF0aDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NwYXRoKCkgPGVtPkNsYXNzcGF0aDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2xhc3NwYXRoKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzcGF0aCA9IENMQVNTUEFUSF9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhU3RhcnRpbmdQb2ludCgpIDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRKYXZhU3RhcnRpbmdQb2ludCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhU3RhcnRpbmdQb2ludCgpIDxlbT5KYXZhIFN0YXJ0aW5nIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRKYXZhU3RhcnRpbmdQb2ludCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSA8ZW0+VXNlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0cmFjdEludGVyZmFjZSgpIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhUUkFDVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0cmFjdEludGVyZmFjZSgpIDxlbT5FeHRyYWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNFeHRyYWN0SW50ZXJmYWNlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRyYWN0SW50ZXJmYWNlID0gRVhUUkFDVF9JTlRFUkZBQ0VfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lID0gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE1hcCgpIDxlbT5NZXRob2QgTWFwPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRNZXRob2RNYXAoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFubm90YXRpb25NYXAoKSA8ZW0+QW5ub3RhdGlvbiBNYXA8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEFubm90YXRpb25NYXAoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBCb29sZWFuPiBhbm5vdGF0aW9uTWFwOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZURpcmVjdG9yeSgpIDxlbT5Tb3VyY2UgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRTb3VyY2VEaXJlY3RvcnkoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlRGlyZWN0b3J5KCkgPGVtPlNvdXJjZSBEaXJlY3Rvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFNvdXJjZURpcmVjdG9yeSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBzb3VyY2VEaXJlY3RvcnkgPSBTT1VSQ0VfRElSRUNUT1JZX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0UG9ydE5hbWUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZSgpIDxlbT5Qb3J0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFBvcnROYW1lKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHBvcnROYW1lID0gUE9SVF9OQU1FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEphdmEyV1NEYXRhTW9kZWxJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5MaXRlcmFscy5KQVZBMl9XU19EQVRBX01PREVMOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU29hcDEyQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIHNvYXAxMkJpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U29hcDEyQmluZGluZyhib29sZWFuIG5ld1NvYXAxMkJpbmRpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRTb2FwMTJCaW5kaW5nID0gc29hcDEyQmluZGluZzsKLSAgICAgICAgc29hcDEyQmluZGluZyA9IG5ld1NvYXAxMkJpbmRpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkcsIG9sZFNvYXAxMkJpbmRpbmcsIHNvYXAxMkJpbmRpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlWFNESW1wb3J0cygpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlWFNESW1wb3J0czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoYm9vbGVhbiBuZXdHZW5lcmF0ZVhTREltcG9ydHMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVhTREltcG9ydHMgPSBnZW5lcmF0ZVhTREltcG9ydHM7Ci0gICAgICAgIGdlbmVyYXRlWFNESW1wb3J0cyA9IG5ld0dlbmVyYXRlWFNESW1wb3J0czsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUywgb2xkR2VuZXJhdGVYU0RJbXBvcnRzLCBnZW5lcmF0ZVhTREltcG9ydHMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV1NETCgpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV1NETDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdTREwoYm9vbGVhbiBuZXdHZW5lcmF0ZVdTREwpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdTREwgPSBnZW5lcmF0ZVdTREw7Ci0gICAgICAgIGdlbmVyYXRlV1NETCA9IG5ld0dlbmVyYXRlV1NETDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMLCBvbGRHZW5lcmF0ZVdTREwsIGdlbmVyYXRlV1NETCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhib29sZWFuIG5ld0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zID0gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuczsKLSAgICAgICAgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyA9IG5ld0dlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUywgb2xkR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucywgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChib29sZWFuIG5ld0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCkgewotICAgICAgICBib29sZWFuIG9sZEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCA9IGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZDsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkID0gbmV3QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVELCBvbGRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQsIGFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbiA9IGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTiwgb2xkR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uLCBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oYm9vbGVhbiBuZXdHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uID0gZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb247Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uID0gbmV3R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT04sIG9sZEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uLCBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihib29sZWFuIG5ld0dlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPSBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gPSBuZXdHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTiwgb2xkR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24sIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uID0gZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOwotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gPSBuZXdHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OLCBvbGRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24sIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgewotICAgICAgICByZXR1cm4gY2xhc3NwYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChTdHJpbmcgbmV3Q2xhc3NwYXRoKSB7Ci0gICAgICAgIFN0cmluZyBvbGRDbGFzc3BhdGggPSBjbGFzc3BhdGg7Ci0gICAgICAgIGNsYXNzcGF0aCA9IG5ld0NsYXNzcGF0aDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19DTEFTU1BBVEgsIG9sZENsYXNzcGF0aCwgY2xhc3NwYXRoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKYXZhU3RhcnRpbmdQb2ludCgpIHsKLSAgICAgICAgcmV0dXJuIGphdmFTdGFydGluZ1BvaW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50KFN0cmluZyBuZXdKYXZhU3RhcnRpbmdQb2ludCkgewotICAgICAgICBTdHJpbmcgb2xkSmF2YVN0YXJ0aW5nUG9pbnQgPSBqYXZhU3RhcnRpbmdQb2ludDsKLSAgICAgICAgamF2YVN0YXJ0aW5nUG9pbnQgPSBuZXdKYXZhU3RhcnRpbmdQb2ludDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5ULCBvbGRKYXZhU3RhcnRpbmdQb2ludCwgamF2YVN0YXJ0aW5nUG9pbnQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoYm9vbGVhbiBuZXdVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci0gICAgICAgIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IG5ld1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UsIG9sZFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSwgdXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFeHRyYWN0SW50ZXJmYWNlKCkgewotICAgICAgICByZXR1cm4gZXh0cmFjdEludGVyZmFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYWN0SW50ZXJmYWNlKGJvb2xlYW4gbmV3RXh0cmFjdEludGVyZmFjZSkgewotICAgICAgICBib29sZWFuIG9sZEV4dHJhY3RJbnRlcmZhY2UgPSBleHRyYWN0SW50ZXJmYWNlOwotICAgICAgICBleHRyYWN0SW50ZXJmYWNlID0gbmV3RXh0cmFjdEludGVyZmFjZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRSwgb2xkRXh0cmFjdEludGVyZmFjZSwgZXh0cmFjdEludGVyZmFjZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZShTdHJpbmcgbmV3U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSkgewotICAgICAgICBTdHJpbmcgb2xkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSA9IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWU7Ci0gICAgICAgIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgPSBuZXdTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUUsIG9sZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBnZXRNZXRob2RNYXAoKSB7Ci0gICAgICAgIHJldHVybiBtZXRob2RNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWV0aG9kTWFwKE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbmV3TWV0aG9kTWFwKSB7Ci0gICAgICAgIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gb2xkTWV0aG9kTWFwID0gbWV0aG9kTWFwOwotICAgICAgICBtZXRob2RNYXAgPSBuZXdNZXRob2RNYXA7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fTUVUSE9EX01BUCwgb2xkTWV0aG9kTWFwLCBtZXRob2RNYXApKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgQm9vbGVhbj4gZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLSAgICAgICAgcmV0dXJuIGFubm90YXRpb25NYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbk1hcChNYXA8U3RyaW5nLCBCb29sZWFuPiBuZXdBbm5vdGF0aW9uTWFwKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG9sZEFubm90YXRpb25NYXAgPSBhbm5vdGF0aW9uTWFwOwotICAgICAgICBhbm5vdGF0aW9uTWFwID0gbmV3QW5ub3RhdGlvbk1hcDsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUCwgb2xkQW5ub3RhdGlvbk1hcCwgYW5ub3RhdGlvbk1hcCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRGlyZWN0b3J5KCkgewotICAgICAgICByZXR1cm4gc291cmNlRGlyZWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZURpcmVjdG9yeShTdHJpbmcgbmV3U291cmNlRGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZyBvbGRTb3VyY2VEaXJlY3RvcnkgPSBzb3VyY2VEaXJlY3Rvcnk7Ci0gICAgICAgIHNvdXJjZURpcmVjdG9yeSA9IG5ld1NvdXJjZURpcmVjdG9yeTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZLCBvbGRTb3VyY2VEaXJlY3RvcnksIHNvdXJjZURpcmVjdG9yeSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBwb3J0TmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQb3J0TmFtZShTdHJpbmcgbmV3UG9ydE5hbWUpIHsKLSAgICAgICAgU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7Ci0gICAgICAgIHBvcnROYW1lID0gbmV3UG9ydE5hbWU7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FLCBvbGRQb3J0TmFtZSwgcG9ydE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzU29hcDEyQmluZGluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlWFNESW1wb3J0cygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVXU0RMKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc3BhdGgoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1VTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19FWFRSQUNUX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHRyYWN0SW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZE1hcCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRQb3J0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0U29hcDEyQmluZGluZygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlWFNESW1wb3J0cygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXU0RMKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6Ci0gICAgICAgICAgICAgICAgc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIOgotICAgICAgICAgICAgICAgIHNldENsYXNzcGF0aCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICBzZXRKYXZhU3RhcnRpbmdQb2ludCgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldEV4dHJhY3RJbnRlcmZhY2UoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVA6Ci0gICAgICAgICAgICAgICAgc2V0TWV0aG9kTWFwKChNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQU5OT1RBVElPTl9NQVA6Ci0gICAgICAgICAgICAgICAgc2V0QW5ub3RhdGlvbk1hcCgoTWFwPFN0cmluZywgQm9vbGVhbj4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TT1VSQ0VfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIHNldFNvdXJjZURpcmVjdG9yeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FOgotICAgICAgICAgICAgICAgIHNldFBvcnROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0gICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0U29hcDEyQmluZGluZyhTT0FQMTJfQklORElOR19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlWFNESW1wb3J0cyhHRU5FUkFURV9YU0RfSU1QT1JUU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dTREw6Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXU0RMKEdFTkVSQVRFX1dTRExfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMoR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIHNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChBTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbihHRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBzZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fQ0xBU1NQQVRIOgotICAgICAgICAgICAgICAgIHNldENsYXNzcGF0aChDTEFTU1BBVEhfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19KQVZBX1NUQVJUSU5HX1BPSU5UOgotICAgICAgICAgICAgICAgIHNldEphdmFTdGFydGluZ1BvaW50KEpBVkFfU1RBUlRJTkdfUE9JTlRfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19VU0VfU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6Ci0gICAgICAgICAgICAgICAgc2V0VXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKFVTRV9TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHNldEV4dHJhY3RJbnRlcmZhY2UoRVhUUkFDVF9JTlRFUkZBQ0VfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FOgotICAgICAgICAgICAgICAgIHNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTkFNRV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX01FVEhPRF9NQVA6Ci0gICAgICAgICAgICAgICAgc2V0TWV0aG9kTWFwKChNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUDoKLSAgICAgICAgICAgICAgICBzZXRBbm5vdGF0aW9uTWFwKChNYXA8U3RyaW5nLCBCb29sZWFuPiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09VUkNFX0RJUkVDVE9SWToKLSAgICAgICAgICAgICAgICBzZXRTb3VyY2VEaXJlY3RvcnkoU09VUkNFX0RJUkVDVE9SWV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1BPUlRfTkFNRToKLSAgICAgICAgICAgICAgICBzZXRQb3J0TmFtZShQT1JUX05BTUVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBzb2FwMTJCaW5kaW5nICE9IFNPQVAxMl9CSU5ESU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVhTREltcG9ydHMgIT0gR0VORVJBVEVfWFNEX0lNUE9SVFNfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXU0RMICE9IEdFTkVSQVRFX1dTRExfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyAhPSBHRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQgIT0gQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRURfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24gIT0gR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbiAhPSBHRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTl9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24gIT0gR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24gIT0gR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0NMQVNTUEFUSDoKLSAgICAgICAgICAgICAgICByZXR1cm4gQ0xBU1NQQVRIX0VERUZBVUxUID09IG51bGwgPyBjbGFzc3BhdGggIT0gbnVsbCA6ICFDTEFTU1BBVEhfRURFRkFVTFQuZXF1YWxzKGNsYXNzcGF0aCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fSkFWQV9TVEFSVElOR19QT0lOVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFWQV9TVEFSVElOR19QT0lOVF9FREVGQVVMVCA9PSBudWxsID8gamF2YVN0YXJ0aW5nUG9pbnQgIT0gbnVsbCA6ICFKQVZBX1NUQVJUSU5HX1BPSU5UX0VERUZBVUxULmVxdWFscyhqYXZhU3RhcnRpbmdQb2ludCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiB1c2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgIT0gVVNFX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0VYVFJBQ1RfSU5URVJGQUNFOgotICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0SW50ZXJmYWNlICE9IEVYVFJBQ1RfSU5URVJGQUNFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUgIT0gbnVsbCA6ICFTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19NRVRIT0RfTUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RNYXAgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX01BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbk1hcCAhPSBudWxsOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPVVJDRV9ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQgPT0gbnVsbCA/IHNvdXJjZURpcmVjdG9yeSAhPSBudWxsIDogIVNPVVJDRV9ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKHNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fUE9SVF9OQU1FOgotICAgICAgICAgICAgICAgIHJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLSAgICAgICAgaWYgKGJhc2VDbGFzcyA9PSBKYXZhMldTQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX1NPQVAxMl9CSU5ESU5HOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfWFNEX0lNUE9SVFM6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XU0RMOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XU0RMOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XUkFQUEVSX0ZBVUxUX0JFQU5TOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRDogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gSmF2YTJXU0NvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19TT0FQMTJfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fU09BUDEyX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOiByZXR1cm4gQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMX19HRU5FUkFURV9YU0RfSU1QT1JUUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETDogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1NETDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fQU5OT1RBVElPTl9QUk9DRVNTSU5HX0VOQUJMRUQ6IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9NRVRIT0RfQU5OT1RBVElPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX1BBUkFNX0FOTk9UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLkpBVkEyX1dTX0RBVEFfTU9ERUxfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjogcmV0dXJuIENYRlBhY2thZ2UuSkFWQTJfV1NfREFUQV9NT0RFTF9fR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUl9BTk5PVEFUSU9OOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgKHNvYXAxMkJpbmRpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHNvYXAxMkJpbmRpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlWFNESW1wb3J0czogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVYU0RJbXBvcnRzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVdTREw6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGdlbmVyYXRlV1NETCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChhbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBnZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNsYXNzcGF0aDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoY2xhc3NwYXRoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBqYXZhU3RhcnRpbmdQb2ludDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoamF2YVN0YXJ0aW5nUG9pbnQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQodXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYWN0SW50ZXJmYWNlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChleHRyYWN0SW50ZXJmYWNlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RNYXA6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKG1ldGhvZE1hcCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYW5ub3RhdGlvbk1hcDogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYW5ub3RhdGlvbk1hcCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgc291cmNlRGlyZWN0b3J5OiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChzb3VyY2VEaXJlY3RvcnkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotfSAvL0phdmEyV1NEYXRhTW9kZWxJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvV1NETDJKYXZhRGF0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC9pbXBsL1dTREwySmF2YURhdGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNDE1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL2ltcGwvV1NETDJKYXZhRGF0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5OCArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKiAkSWQ6IFdTREwySmF2YURhdGFNb2RlbEltcGwuamF2YSx2IDEuMyAyMDEwLzAxLzE3IDE5OjU2OjU2IHNjbGFya2UgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVVbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uIDxlbT5HZW5lcmF0ZSBJbXBsZW1lbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1Byb2Nlc3NTT0FQSGVhZGVycyA8ZW0+UHJvY2VzcyBTT0FQIEhlYWRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nIDxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNWYWxpZGF0ZSA8ZW0+VmFsaWRhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0V3NkbFZlcnNpb24gPGVtPldzZGwgVmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1VzZURlZmF1bHRWYWx1ZXMgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRYamNBcmdzIDxlbT5YamMgQXJnczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc05vQWRkcmVzc0JpbmRpbmcgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY1VzZURlZmF1bHRWYWx1ZXMgPGVtPlhqYyBVc2UgRGVmYXVsdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNUb1N0cmluZyA8ZW0+WGpjIFRvIFN0cmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNUb1N0cmluZ1NpbXBsZSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjaXNYamNMb2NhdG9yIDxlbT5YamMgTG9jYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNpc1hqY1N5bmNNZXRob2RzIDxlbT5YamMgU3luYyBNZXRob2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzWGpjTWFya0dlbmVyYXRlZCA8ZW0+WGpjIE1hcmsgR2VuZXJhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldFhqY0VwaXNvZGVGaWxlIDxlbT5YamMgRXBpc29kZSBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2lzQXV0b05hbWVSZXNvbHV0aW9uIDxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRJbmNsdWRlZE5hbWVzcGFjZXMgPGVtPkluY2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5pbXBsLldTREwySmF2YURhdGFNb2RlbEltcGwjZ2V0QmluZGluZ0ZpbGVzIDxlbT5CaW5kaW5nIEZpbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcyA8ZW0+RXhjbHVkZWQgTmFtZXNwYWNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLmltcGwuV1NETDJKYXZhRGF0YU1vZGVsSW1wbCNnZXRDYXRhbG9nRmlsZSA8ZW0+Q2F0YWxvZyBGaWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuaW1wbC5XU0RMMkphdmFEYXRhTW9kZWxJbXBsI2dldEphdmFTb3VyY2VGb2xkZXIgPGVtPkphdmEgU291cmNlIEZvbGRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTREwySmF2YURhdGFNb2RlbEltcGwgZXh0ZW5kcyBDWEZEYXRhTW9kZWxJbXBsIGltcGxlbWVudHMgV1NETDJKYXZhRGF0YU1vZGVsIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgPGVtPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9JTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSA8ZW0+R2VuZXJhdGUgSW1wbGVtZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbiA9IEdFTkVSQVRFX0lNUExFTUVOVEFUSU9OX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJvY2Vzc1NPQVBIZWFkZXJzKCkgPGVtPlByb2Nlc3MgU09BUCBIZWFkZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBST0NFU1NfU09BUF9IRUFERVJTX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2Nlc3NTT0FQSGVhZGVycygpIDxlbT5Qcm9jZXNzIFNPQVAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNQcm9jZXNzU09BUEhlYWRlcnMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHByb2Nlc3NTT0FQSGVhZGVycyA9IFBST0NFU1NfU09BUF9IRUFERVJTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSA8ZW0+TG9hZCBEZWZhdWx0IE5hbWVzcGFjZSBQYWNrYWdlIE5hbWUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkdfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpIDxlbT5Mb2FkIERlZmF1bHQgTmFtZXNwYWNlIFBhY2thZ2UgTmFtZSBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyA9IExPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkdfRURFRkFVTFQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIDxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkdfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpIDxlbT5Mb2FkIERlZmF1bHQgRXhjbHVkZXMgTmFtZXBzYWNlIE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nID0gTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVmFsaWRhdGUoKSA8ZW0+VmFsaWRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzVmFsaWRhdGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWQUxJREFURV9FREVGQVVMVCA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZhbGlkYXRlKCkgPGVtPlZhbGlkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1ZhbGlkYXRlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZSA9IFZBTElEQVRFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdzZGxWZXJzaW9uKCkgPGVtPldzZGwgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0V3NkbFZlcnNpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfVkVSU0lPTl9FREVGQVVMVCA9ICIxLjEiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbFZlcnNpb24oKSA8ZW0+V3NkbCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRXc2RsVmVyc2lvbigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyB3c2RsVmVyc2lvbiA9IFdTRExfVkVSU0lPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZURlZmF1bHRWYWx1ZXMoKSA8ZW0+VXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfREVGQVVMVF9WQUxVRVNfRURFRkFVTFQgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VEZWZhdWx0VmFsdWVzKCkgPGVtPlVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VEZWZhdWx0VmFsdWVzID0gVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhqY0FyZ3MoKSA8ZW0+WGpjIEFyZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFhqY0FyZ3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19BUkdTX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhqY0FyZ3MoKSA8ZW0+WGpjIEFyZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFhqY0FyZ3MoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgeGpjQXJncyA9IFhKQ19BUkdTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9BZGRyZXNzQmluZGluZygpIDxlbT5ObyBBZGRyZXNzIEJpbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzTm9BZGRyZXNzQmluZGluZygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb0FkZHJlc3NCaW5kaW5nKCkgPGVtPk5vIEFkZHJlc3MgQmluZGluZzwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNOb0FkZHJlc3NCaW5kaW5nKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBub0FkZHJlc3NCaW5kaW5nID0gTk9fQUREUkVTU19CSU5ESU5HX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVXNlRGVmYXVsdFZhbHVlcygpIDxlbT5YamMgVXNlIERlZmF1bHQgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSA8ZW0+WGpjIFVzZSBEZWZhdWx0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNVc2VEZWZhdWx0VmFsdWVzID0gWEpDX1VTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nKCkgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfVE9fU1RSSU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nKCkgPGVtPlhqYyBUbyBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmcoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1RvU3RyaW5nID0gWEpDX1RPX1NUUklOR19FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkgPGVtPlhqYyBUbyBTdHJpbmcgTXVsdGkgTGluZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZ011bHRpTGluZSgpIDxlbT5YamMgVG8gU3RyaW5nIE11bHRpIExpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHhqY1RvU3RyaW5nTXVsdGlMaW5lID0gWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKSA8ZW0+WGpjIFRvIFN0cmluZyBTaW1wbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjVG9TdHJpbmdTaW1wbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYSkNfVE9fU1RSSU5HX1NJTVBMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNUb1N0cmluZ1NpbXBsZSgpIDxlbT5YamMgVG8gU3RyaW5nIFNpbXBsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNUb1N0cmluZ1NpbXBsZSgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjVG9TdHJpbmdTaW1wbGUgPSBYSkNfVE9fU1RSSU5HX1NJTVBMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY0xvY2F0b3IoKSA8ZW0+WGpjIExvY2F0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjTG9jYXRvcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19MT0NBVE9SX0VERUZBVUxUID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1hqY0xvY2F0b3IoKSA8ZW0+WGpjIExvY2F0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjTG9jYXRvcigpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjTG9jYXRvciA9IFhKQ19MT0NBVE9SX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjU3luY01ldGhvZHMoKSA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNTeW5jTWV0aG9kcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19TWU5DX01FVEhPRFNfRURFRkFVTFQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjU3luY01ldGhvZHMoKSA8ZW0+WGpjIFN5bmMgTWV0aG9kczwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNTeW5jTWV0aG9kcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4geGpjU3luY01ldGhvZHMgPSBYSkNfU1lOQ19NRVRIT0RTX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWGpjTWFya0dlbmVyYXRlZCgpIDxlbT5YamMgTWFyayBHZW5lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzWGpjTWFya0dlbmVyYXRlZCgpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYamNNYXJrR2VuZXJhdGVkKCkgPGVtPlhqYyBNYXJrIEdlbmVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNYamNNYXJrR2VuZXJhdGVkKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiB4amNNYXJrR2VuZXJhdGVkID0gWEpDX01BUktfR0VORVJBVEVEX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhqY0VwaXNvZGVGaWxlKCkgPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFhqY0VwaXNvZGVGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfRVBJU09ERV9GSUxFX0VERUZBVUxUID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhqY0VwaXNvZGVGaWxlKCkgPGVtPlhqYyBFcGlzb2RlIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldFhqY0VwaXNvZGVGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHhqY0VwaXNvZGVGaWxlID0gWEpDX0VQSVNPREVfRklMRV9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9OYW1lUmVzb2x1dGlvbigpIDxlbT5BdXRvIE5hbWUgUmVzb2x1dGlvbjwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjaXNBdXRvTmFtZVJlc29sdXRpb24oKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVCA9IGZhbHNlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvTmFtZVJlc29sdXRpb24oKSA8ZW0+QXV0byBOYW1lIFJlc29sdXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2lzQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTmFtZVJlc29sdXRpb24gPSBBVVRPX05BTUVfUkVTT0xVVElPTl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVkTmFtZXNwYWNlcygpIDxlbT5JbmNsdWRlZCBOYW1lc3BhY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkTmFtZXNwYWNlczsKLQotICAgIC8qKgotICAgICAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJpbmRpbmdGaWxlcygpIDxlbT5CaW5kaW5nIEZpbGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEJpbmRpbmdGaWxlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gYmluZGluZ0ZpbGVzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkgPGVtPkV4Y2x1ZGVkIE5hbWVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEV4Y2x1ZGVkTmFtZXNwYWNlcygpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqIEBvcmRlcmVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gZXhjbHVkZWROYW1lc3BhY2VzOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2dGaWxlKCkgPGVtPkNhdGFsb2cgRmlsZTwvZW0+fScgYXR0cmlidXRlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHNlZSAjZ2V0Q2F0YWxvZ0ZpbGUoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRklMRV9FREVGQVVMVCA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nRmlsZSgpIDxlbT5DYXRhbG9nIEZpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldENhdGFsb2dGaWxlKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2dGaWxlID0gQ0FUQUxPR19GSUxFX0VERUZBVUxUOwotCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFTb3VyY2VGb2xkZXIoKSA8ZW0+SmF2YSBTb3VyY2UgRm9sZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAc2VlICNnZXRKYXZhU291cmNlRm9sZGVyKCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICogQG9yZGVyZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQgPSBudWxsOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmF2YVNvdXJjZUZvbGRlcigpIDxlbT5KYXZhIFNvdXJjZSBGb2xkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBzZWUgI2dldEphdmFTb3VyY2VGb2xkZXIoKQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKiBAb3JkZXJlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgamF2YVNvdXJjZUZvbGRlciA9IEpBVkFfU09VUkNFX0ZPTERFUl9FREVGQVVMVDsKLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBXU0RMMkphdmFEYXRhTW9kZWxJbXBsKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotICAgICAgICByZXR1cm4gQ1hGUGFja2FnZS5MaXRlcmFscy5XU0RMMl9KQVZBX0RBVEFfTU9ERUw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkgewotICAgICAgICByZXR1cm4gZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUltcGxlbWVudGF0aW9uKGJvb2xlYW4gbmV3R2VuZXJhdGVJbXBsZW1lbnRhdGlvbikgewotICAgICAgICBib29sZWFuIG9sZEdlbmVyYXRlSW1wbGVtZW50YXRpb24gPSBnZW5lcmF0ZUltcGxlbWVudGF0aW9uOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uID0gbmV3R2VuZXJhdGVJbXBsZW1lbnRhdGlvbjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OLCBvbGRHZW5lcmF0ZUltcGxlbWVudGF0aW9uLCBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNQcm9jZXNzU09BUEhlYWRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzU09BUEhlYWRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKGJvb2xlYW4gbmV3UHJvY2Vzc1NPQVBIZWFkZXJzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkUHJvY2Vzc1NPQVBIZWFkZXJzID0gcHJvY2Vzc1NPQVBIZWFkZXJzOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnMgPSBuZXdQcm9jZXNzU09BUEhlYWRlcnM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUywgb2xkUHJvY2Vzc1NPQVBIZWFkZXJzLCBwcm9jZXNzU09BUEhlYWRlcnMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBuZXdMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBib29sZWFuIG9sZExvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nID0gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmc7Ci0gICAgICAgIGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nID0gbmV3TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HLCBvbGRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZywgbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkgewotICAgICAgICByZXR1cm4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBuZXdMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBib29sZWFuIG9sZExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nID0gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmc7Ci0gICAgICAgIGxvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nID0gbmV3TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkcsIG9sZExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nLCBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGUoKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShib29sZWFuIG5ld1ZhbGlkYXRlKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVmFsaWRhdGUgPSB2YWxpZGF0ZTsKLSAgICAgICAgdmFsaWRhdGUgPSBuZXdWYWxpZGF0ZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFLCBvbGRWYWxpZGF0ZSwgdmFsaWRhdGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFdzZGxWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0V3NkbFZlcnNpb24oU3RyaW5nIG5ld1dzZGxWZXJzaW9uKSB7Ci0gICAgICAgIFN0cmluZyBvbGRXc2RsVmVyc2lvbiA9IHdzZGxWZXJzaW9uOwotICAgICAgICB3c2RsVmVyc2lvbiA9IG5ld1dzZGxWZXJzaW9uOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OLCBvbGRXc2RsVmVyc2lvbiwgd3NkbFZlcnNpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiB1c2VEZWZhdWx0VmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFVzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiBuZXdVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkVXNlRGVmYXVsdFZhbHVlcyA9IHVzZURlZmF1bHRWYWx1ZXM7Ci0gICAgICAgIHVzZURlZmF1bHRWYWx1ZXMgPSBuZXdVc2VEZWZhdWx0VmFsdWVzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTLCBvbGRVc2VEZWZhdWx0VmFsdWVzLCB1c2VEZWZhdWx0VmFsdWVzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRYamNBcmdzKCkgewotICAgICAgICByZXR1cm4geGpjQXJnczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNBcmdzKFN0cmluZyBuZXdYamNBcmdzKSB7Ci0gICAgICAgIFN0cmluZyBvbGRYamNBcmdzID0geGpjQXJnczsKLSAgICAgICAgeGpjQXJncyA9IG5ld1hqY0FyZ3M7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUywgb2xkWGpjQXJncywgeGpjQXJncykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzTm9BZGRyZXNzQmluZGluZygpIHsKLSAgICAgICAgcmV0dXJuIG5vQWRkcmVzc0JpbmRpbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Tm9BZGRyZXNzQmluZGluZyhib29sZWFuIG5ld05vQWRkcmVzc0JpbmRpbmcpIHsKLSAgICAgICAgYm9vbGVhbiBvbGROb0FkZHJlc3NCaW5kaW5nID0gbm9BZGRyZXNzQmluZGluZzsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZyA9IG5ld05vQWRkcmVzc0JpbmRpbmc7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkcsIG9sZE5vQWRkcmVzc0JpbmRpbmcsIG5vQWRkcmVzc0JpbmRpbmcpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiB4amNVc2VEZWZhdWx0VmFsdWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiBuZXdYamNVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjVXNlRGVmYXVsdFZhbHVlcyA9IHhqY1VzZURlZmF1bHRWYWx1ZXM7Ci0gICAgICAgIHhqY1VzZURlZmF1bHRWYWx1ZXMgPSBuZXdYamNVc2VEZWZhdWx0VmFsdWVzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUywgb2xkWGpjVXNlRGVmYXVsdFZhbHVlcywgeGpjVXNlRGVmYXVsdFZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZyhib29sZWFuIG5ld1hqY1RvU3RyaW5nKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjVG9TdHJpbmcgPSB4amNUb1N0cmluZzsKLSAgICAgICAgeGpjVG9TdHJpbmcgPSBuZXdYamNUb1N0cmluZzsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkcsIG9sZFhqY1RvU3RyaW5nLCB4amNUb1N0cmluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSB7Ci0gICAgICAgIHJldHVybiB4amNUb1N0cmluZ011bHRpTGluZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNUb1N0cmluZ011bHRpTGluZShib29sZWFuIG5ld1hqY1RvU3RyaW5nTXVsdGlMaW5lKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjVG9TdHJpbmdNdWx0aUxpbmUgPSB4amNUb1N0cmluZ011bHRpTGluZTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmUgPSBuZXdYamNUb1N0cmluZ011bHRpTGluZTsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORSwgb2xkWGpjVG9TdHJpbmdNdWx0aUxpbmUsIHhqY1RvU3RyaW5nTXVsdGlMaW5lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNYamNUb1N0cmluZ1NpbXBsZSgpIHsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFhqY1RvU3RyaW5nU2ltcGxlKGJvb2xlYW4gbmV3WGpjVG9TdHJpbmdTaW1wbGUpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNUb1N0cmluZ1NpbXBsZSA9IHhqY1RvU3RyaW5nU2ltcGxlOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZSA9IG5ld1hqY1RvU3RyaW5nU2ltcGxlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEUsIG9sZFhqY1RvU3RyaW5nU2ltcGxlLCB4amNUb1N0cmluZ1NpbXBsZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjTG9jYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIG5ld1hqY0xvY2F0b3IpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNMb2NhdG9yID0geGpjTG9jYXRvcjsKLSAgICAgICAgeGpjTG9jYXRvciA9IG5ld1hqY0xvY2F0b3I7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUiwgb2xkWGpjTG9jYXRvciwgeGpjTG9jYXRvcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjU3luY01ldGhvZHMoKSB7Ci0gICAgICAgIHJldHVybiB4amNTeW5jTWV0aG9kczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIG5ld1hqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkWGpjU3luY01ldGhvZHMgPSB4amNTeW5jTWV0aG9kczsKLSAgICAgICAgeGpjU3luY01ldGhvZHMgPSBuZXdYamNTeW5jTWV0aG9kczsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFMsIG9sZFhqY1N5bmNNZXRob2RzLCB4amNTeW5jTWV0aG9kcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzWGpjTWFya0dlbmVyYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIHhqY01hcmtHZW5lcmF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTWFya0dlbmVyYXRlZChib29sZWFuIG5ld1hqY01hcmtHZW5lcmF0ZWQpIHsKLSAgICAgICAgYm9vbGVhbiBvbGRYamNNYXJrR2VuZXJhdGVkID0geGpjTWFya0dlbmVyYXRlZDsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZCA9IG5ld1hqY01hcmtHZW5lcmF0ZWQ7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQsIG9sZFhqY01hcmtHZW5lcmF0ZWQsIHhqY01hcmtHZW5lcmF0ZWQpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFhqY0VwaXNvZGVGaWxlKCkgewotICAgICAgICByZXR1cm4geGpjRXBpc29kZUZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0WGpjRXBpc29kZUZpbGUoU3RyaW5nIG5ld1hqY0VwaXNvZGVGaWxlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRYamNFcGlzb2RlRmlsZSA9IHhqY0VwaXNvZGVGaWxlOwotICAgICAgICB4amNFcGlzb2RlRmlsZSA9IG5ld1hqY0VwaXNvZGVGaWxlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRSwgb2xkWGpjRXBpc29kZUZpbGUsIHhqY0VwaXNvZGVGaWxlKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdXRvTmFtZVJlc29sdXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gbmV3QXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIGJvb2xlYW4gb2xkQXV0b05hbWVSZXNvbHV0aW9uID0gYXV0b05hbWVSZXNvbHV0aW9uOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb24gPSBuZXdBdXRvTmFtZVJlc29sdXRpb247Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTiwgb2xkQXV0b05hbWVSZXNvbHV0aW9uLCBhdXRvTmFtZVJlc29sdXRpb24pKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbmNsdWRlZE5hbWVzcGFjZXMoKSB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZWROYW1lc3BhY2VzKE1hcDxTdHJpbmcsIFN0cmluZz4gbmV3SW5jbHVkZWROYW1lc3BhY2VzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb2xkSW5jbHVkZWROYW1lc3BhY2VzID0gaW5jbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBuZXdJbmNsdWRlZE5hbWVzcGFjZXM7Ci0gICAgICAgIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLSAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTLCBvbGRJbmNsdWRlZE5hbWVzcGFjZXMsIGluY2x1ZGVkTmFtZXNwYWNlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QmluZGluZ0ZpbGVzKCkgewotICAgICAgICBpZiAoYmluZGluZ0ZpbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGJpbmRpbmdGaWxlcyA9IG5ldyBFRGF0YVR5cGVVbmlxdWVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kaW5nRmlsZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0RXhjbHVkZWROYW1lc3BhY2VzKCkgewotICAgICAgICByZXR1cm4gZXhjbHVkZWROYW1lc3BhY2VzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkTmFtZXNwYWNlcyhNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld0V4Y2x1ZGVkTmFtZXNwYWNlcykgewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZEV4Y2x1ZGVkTmFtZXNwYWNlcyA9IGV4Y2x1ZGVkTmFtZXNwYWNlczsKLSAgICAgICAgZXhjbHVkZWROYW1lc3BhY2VzID0gbmV3RXhjbHVkZWROYW1lc3BhY2VzOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUywgb2xkRXhjbHVkZWROYW1lc3BhY2VzLCBleGNsdWRlZE5hbWVzcGFjZXMpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENhdGFsb2dGaWxlKCkgewotICAgICAgICByZXR1cm4gY2F0YWxvZ0ZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0ZpbGUoU3RyaW5nIG5ld0NhdGFsb2dGaWxlKSB7Ci0gICAgICAgIFN0cmluZyBvbGRDYXRhbG9nRmlsZSA9IGNhdGFsb2dGaWxlOwotICAgICAgICBjYXRhbG9nRmlsZSA9IG5ld0NhdGFsb2dGaWxlOwotICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0gICAgICAgICAgICBlTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFLCBvbGRDYXRhbG9nRmlsZSwgY2F0YWxvZ0ZpbGUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEphdmFTb3VyY2VGb2xkZXIoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhU291cmNlRm9sZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIG5ld0phdmFTb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgU3RyaW5nIG9sZEphdmFTb3VyY2VGb2xkZXIgPSBqYXZhU291cmNlRm9sZGVyOwotICAgICAgICBqYXZhU291cmNlRm9sZGVyID0gbmV3SmF2YVNvdXJjZUZvbGRlcjsKLSAgICAgICAgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotICAgICAgICAgICAgZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUiwgb2xkSmF2YVNvdXJjZUZvbGRlciwgamF2YVNvdXJjZUZvbGRlcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1Byb2Nlc3NTT0FQSGVhZGVycygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZGF0ZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRXc2RsVmVyc2lvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1VzZURlZmF1bHRWYWx1ZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRYamNBcmdzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzTm9BZGRyZXNzQmluZGluZygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNVc2VEZWZhdWx0VmFsdWVzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1RvU3RyaW5nKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1RvU3RyaW5nU2ltcGxlKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNYamNMb2NhdG9yKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIHJldHVybiBpc1hqY1N5bmNNZXRob2RzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTUFSS19HRU5FUkFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzWGpjTWFya0dlbmVyYXRlZCgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0WGpjRXBpc29kZUZpbGUoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBpc0F1dG9OYW1lUmVzb2x1dGlvbigpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19CSU5ESU5HX0ZJTEVTOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRCaW5kaW5nRmlsZXMoKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEV4Y2x1ZGVkTmFtZXNwYWNlcygpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQ0FUQUxPR19GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDYXRhbG9nRmlsZSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSOgotICAgICAgICAgICAgICAgIHJldHVybiBnZXRKYXZhU291cmNlRm9sZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHNldFByb2Nlc3NTT0FQSGVhZGVycygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIHNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBzZXRVc2VEZWZhdWx0VmFsdWVzKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzoKLSAgICAgICAgICAgICAgICBzZXRYamNBcmdzKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBzZXROb0FkZHJlc3NCaW5kaW5nKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZ011bHRpTGluZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19TSU1QTEU6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVG9TdHJpbmdTaW1wbGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHNldFhqY0xvY2F0b3IoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgc2V0WGpjU3luY01ldGhvZHMoKEJvb2xlYW4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICBzZXRYamNNYXJrR2VuZXJhdGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHNldFhqY0VwaXNvZGVGaWxlKChTdHJpbmcpbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHNldEF1dG9OYW1lUmVzb2x1dGlvbigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSU5DTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICBzZXRJbmNsdWRlZE5hbWVzcGFjZXMoKE1hcDxTdHJpbmcsIFN0cmluZz4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVM6Ci0gICAgICAgICAgICAgICAgZ2V0QmluZGluZ0ZpbGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBnZXRCaW5kaW5nRmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0VYQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgc2V0RXhjbHVkZWROYW1lc3BhY2VzKChNYXA8U3RyaW5nLCBTdHJpbmc+KW5ld1ZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0Q2F0YWxvZ0ZpbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fSkFWQV9TT1VSQ0VfRk9MREVSOgotICAgICAgICAgICAgICAgIHNldEphdmFTb3VyY2VGb2xkZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLSAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOgotICAgICAgICAgICAgICAgIHNldFByb2Nlc3NTT0FQSGVhZGVycyhQUk9DRVNTX1NPQVBfSEVBREVSU19FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzoKLSAgICAgICAgICAgICAgICBzZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhMT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6Ci0gICAgICAgICAgICAgICAgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19WQUxJREFURToKLSAgICAgICAgICAgICAgICBzZXRWYWxpZGF0ZShWQUxJREFURV9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHNldFdzZGxWZXJzaW9uKFdTRExfVkVSU0lPTl9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOgotICAgICAgICAgICAgICAgIHNldFVzZURlZmF1bHRWYWx1ZXMoVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzoKLSAgICAgICAgICAgICAgICBzZXRYamNBcmdzKFhKQ19BUkdTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgc2V0Tm9BZGRyZXNzQmluZGluZyhOT19BRERSRVNTX0JJTkRJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyhYSkNfVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nKFhKQ19UT19TVFJJTkdfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORToKLSAgICAgICAgICAgICAgICBzZXRYamNUb1N0cmluZ011bHRpTGluZShYSkNfVE9fU1RSSU5HX01VTFRJX0xJTkVfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHNldFhqY1RvU3RyaW5nU2ltcGxlKFhKQ19UT19TVFJJTkdfU0lNUExFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICBzZXRYamNMb2NhdG9yKFhKQ19MT0NBVE9SX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOgotICAgICAgICAgICAgICAgIHNldFhqY1N5bmNNZXRob2RzKFhKQ19TWU5DX01FVEhPRFNfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICBzZXRYamNNYXJrR2VuZXJhdGVkKFhKQ19NQVJLX0dFTkVSQVRFRF9FREVGQVVMVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRToKLSAgICAgICAgICAgICAgICBzZXRYamNFcGlzb2RlRmlsZShYSkNfRVBJU09ERV9GSUxFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjoKLSAgICAgICAgICAgICAgICBzZXRBdXRvTmFtZVJlc29sdXRpb24oQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0lOQ0xVREVEX05BTUVTUEFDRVM6Ci0gICAgICAgICAgICAgICAgc2V0SW5jbHVkZWROYW1lc3BhY2VzKChNYXA8U3RyaW5nLCBTdHJpbmc+KW51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVM6Ci0gICAgICAgICAgICAgICAgZ2V0QmluZGluZ0ZpbGVzKCkuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19FWENMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHNldEV4Y2x1ZGVkTmFtZXNwYWNlcygoTWFwPFN0cmluZywgU3RyaW5nPiludWxsKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEU6Ci0gICAgICAgICAgICAgICAgc2V0Q2F0YWxvZ0ZpbGUoQ0FUQUxPR19GSUxFX0VERUZBVUxUKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19KQVZBX1NPVVJDRV9GT0xERVI6Ci0gICAgICAgICAgICAgICAgc2V0SmF2YVNvdXJjZUZvbGRlcihKQVZBX1NPVVJDRV9GT0xERVJfRURFRkFVTFQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlSW1wbGVtZW50YXRpb24gIT0gR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJzICE9IFBST0NFU1NfU09BUF9IRUFERVJTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcgIT0gTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcgIT0gTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlICE9IFZBTElEQVRFX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fV1NETF9WRVJTSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBXU0RMX1ZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxWZXJzaW9uICE9IG51bGwgOiAhV1NETF9WRVJTSU9OX0VERUZBVUxULmVxdWFscyh3c2RsVmVyc2lvbik7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVzZURlZmF1bHRWYWx1ZXMgIT0gVVNFX0RFRkFVTFRfVkFMVUVTX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0FSR1M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhKQ19BUkdTX0VERUZBVUxUID09IG51bGwgPyB4amNBcmdzICE9IG51bGwgOiAhWEpDX0FSR1NfRURFRkFVTFQuZXF1YWxzKHhqY0FyZ3MpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fTk9fQUREUkVTU19CSU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBub0FkZHJlc3NCaW5kaW5nICE9IE5PX0FERFJFU1NfQklORElOR19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1VzZURlZmF1bHRWYWx1ZXMgIT0gWEpDX1VTRV9ERUZBVUxUX1ZBTFVFU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nICE9IFhKQ19UT19TVFJJTkdfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nTXVsdGlMaW5lICE9IFhKQ19UT19TVFJJTkdfTVVMVElfTElORV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNUb1N0cmluZ1NpbXBsZSAhPSBYSkNfVE9fU1RSSU5HX1NJTVBMRV9FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOgotICAgICAgICAgICAgICAgIHJldHVybiB4amNMb2NhdG9yICE9IFhKQ19MT0NBVE9SX0VERUZBVUxUOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjU3luY01ldGhvZHMgIT0gWEpDX1NZTkNfTUVUSE9EU19FREVGQVVMVDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19NQVJLX0dFTkVSQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4geGpjTWFya0dlbmVyYXRlZCAhPSBYSkNfTUFSS19HRU5FUkFURURfRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOgotICAgICAgICAgICAgICAgIHJldHVybiBYSkNfRVBJU09ERV9GSUxFX0VERUZBVUxUID09IG51bGwgPyB4amNFcGlzb2RlRmlsZSAhPSBudWxsIDogIVhKQ19FUElTT0RFX0ZJTEVfRURFRkFVTFQuZXF1YWxzKHhqY0VwaXNvZGVGaWxlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIHJldHVybiBhdXRvTmFtZVJlc29sdXRpb24gIT0gQVVUT19OQU1FX1JFU09MVVRJT05fRURFRkFVTFQ7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19JTkNMVURFRF9OQU1FU1BBQ0VTOgotICAgICAgICAgICAgICAgIHJldHVybiBpbmNsdWRlZE5hbWVzcGFjZXMgIT0gbnVsbDsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0JJTkRJTkdfRklMRVM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlcyAhPSBudWxsICYmICFiaW5kaW5nRmlsZXMuaXNFbXB0eSgpOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fRVhDTFVERURfTkFNRVNQQUNFUzoKLSAgICAgICAgICAgICAgICByZXR1cm4gZXhjbHVkZWROYW1lc3BhY2VzICE9IG51bGw7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19DQVRBTE9HX0ZJTEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENBVEFMT0dfRklMRV9FREVGQVVMVCA9PSBudWxsID8gY2F0YWxvZ0ZpbGUgIT0gbnVsbCA6ICFDQVRBTE9HX0ZJTEVfRURFRkFVTFQuZXF1YWxzKGNhdGFsb2dGaWxlKTsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0pBVkFfU09VUkNFX0ZPTERFUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxUID09IG51bGwgPyBqYXZhU291cmNlRm9sZGVyICE9IG51bGwgOiAhSkFWQV9TT1VSQ0VfRk9MREVSX0VERUZBVUxULmVxdWFscyhqYXZhU291cmNlRm9sZGVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotICAgICAgICBpZiAoYmFzZUNsYXNzID09IFdTREwySmF2YUNvbnRleHQuY2xhc3MpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1BST0NFU1NfU09BUF9IRUFERVJTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1ZBTElEQVRFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1ZBTElEQVRFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19XU0RMX1ZFUlNJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfQVJHUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfQVJHUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTk9fQUREUkVTU19CSU5ESU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfTVVMVElfTElORTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVE9fU1RSSU5HX1NJTVBMRTogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfTE9DQVRPUjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfU1lOQ19NRVRIT0RTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfRVBJU09ERV9GSUxFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fQVVUT19OQU1FX1JFU09MVVRJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fQVVUT19OQU1FX1JFU09MVVRJT047Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0gICAgICAgIGlmIChiYXNlQ2xhc3MgPT0gV1NETDJKYXZhQ29udGV4dC5jbGFzcykgewotICAgICAgICAgICAgc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT046IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fR0VORVJBVEVfSU1QTEVNRU5UQVRJT047Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fUFJPQ0VTU19TT0FQX0hFQURFUlM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fUFJPQ0VTU19TT0FQX0hFQURFUlM7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX05BTUVTUEFDRV9QQUNLQUdFX05BTUVfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19MT0FEX0RFRkFVTFRfRVhDTFVERVNfTkFNRVBTQUNFX01BUFBJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVkFMSURBVEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVkFMSURBVEU7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fV1NETF9WRVJTSU9OOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1dTRExfVkVSU0lPTjsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19BUkdTOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19BUkdTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkc6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklORzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1RPX1NUUklOR19NVUxUSV9MSU5FOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkdfU0lNUExFOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19UT19TVFJJTkdfU0lNUExFOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SOiByZXR1cm4gQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0RBVEFfTU9ERUxfX1hKQ19MT0NBVE9SOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFM6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX1NZTkNfTUVUSE9EUzsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQ6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX01BUktfR0VORVJBVEVEOwotICAgICAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19FUElTT0RFX0ZJTEU6IHJldHVybiBDWEZQYWNrYWdlLldTREwyX0pBVkFfREFUQV9NT0RFTF9fWEpDX0VQSVNPREVfRklMRTsKLSAgICAgICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTjogcmV0dXJuIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMX19BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChnZW5lcmF0ZUltcGxlbWVudGF0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChnZW5lcmF0ZUltcGxlbWVudGF0aW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcm9jZXNzU09BUEhlYWRlcnM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHByb2Nlc3NTT0FQSGVhZGVycyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmc6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGxvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQobG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZhbGlkYXRlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWxpZGF0ZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgd3NkbFZlcnNpb246ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHdzZGxWZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB1c2VEZWZhdWx0VmFsdWVzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNBcmdzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNBcmdzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBub0FkZHJlc3NCaW5kaW5nOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChub0FkZHJlc3NCaW5kaW5nKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNVc2VEZWZhdWx0VmFsdWVzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNVc2VEZWZhdWx0VmFsdWVzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNUb1N0cmluZzogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjVG9TdHJpbmcpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY1RvU3RyaW5nTXVsdGlMaW5lOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgeGpjVG9TdHJpbmdTaW1wbGU6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY1RvU3RyaW5nU2ltcGxlKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNMb2NhdG9yOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNMb2NhdG9yKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCB4amNTeW5jTWV0aG9kczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoeGpjU3luY01ldGhvZHMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY01hcmtHZW5lcmF0ZWQ6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKHhqY01hcmtHZW5lcmF0ZWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHhqY0VwaXNvZGVGaWxlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCh4amNFcGlzb2RlRmlsZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgYXV0b05hbWVSZXNvbHV0aW9uOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChhdXRvTmFtZVJlc29sdXRpb24pOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVkTmFtZXNwYWNlczogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaW5jbHVkZWROYW1lc3BhY2VzKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBiaW5kaW5nRmlsZXM6ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJpbmRpbmdGaWxlcyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZWROYW1lc3BhY2VzOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChleGNsdWRlZE5hbWVzcGFjZXMpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2dGaWxlOiAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChjYXRhbG9nRmlsZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgamF2YVNvdXJjZUZvbGRlcjogIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoamF2YVNvdXJjZUZvbGRlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJyknKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotfSAvL1dTREwySmF2YURhdGFNb2RlbEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvbW9kZWwvdXRpbC9DWEZBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjg4OTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogJElkOiBDWEZBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4zIDIwMTAvMDEvMTcgMTk6NTY6NTYgc2NsYXJrZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgQ1hGUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIENYRkFkYXB0ZXJGYWN0b3J5KCkgewotICAgICAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIG1vZGVsUGFja2FnZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotICAgICAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBDWEZTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQotICAgICAgICBuZXcgQ1hGU3dpdGNoPEFkYXB0ZXI+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQ1hGQ29udGV4dChDWEZDb250ZXh0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDWEZDb250ZXh0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQ1hGRGF0YU1vZGVsKENYRkRhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQ1hGRGF0YU1vZGVsQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlSmF2YTJXU0NvbnRleHQoSmF2YTJXU0NvbnRleHQgb2JqZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmEyV1NDb250ZXh0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlSmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVKYXZhMldTRGF0YU1vZGVsQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlV1NETDJKYXZhQ29udGV4dChXU0RMMkphdmFDb250ZXh0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVXU0RMMkphdmFDb250ZXh0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlV1NETDJKYXZhRGF0YU1vZGVsKFdTREwySmF2YURhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBjYXNlQ1hGSW5zdGFsbChDWEZJbnN0YWxsIG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDWEZJbnN0YWxsQWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLSAgICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0IDxlbT5Db250ZXh0PC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNYRkNvbnRleHRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWwgPGVtPkRhdGEgTW9kZWw8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVDWEZEYXRhTW9kZWxBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dCA8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0NvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YTJXU0NvbnRleHRBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsIDxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmEyV1NEYXRhTW9kZWxBZGFwdGVyKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0IDxlbT5XU0RMMiBKYXZhIENvbnRleHQ8L2VtPn0nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETDJKYXZhQ29udGV4dEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbCA8ZW0+V1NETDIgSmF2YSBEYXRhIE1vZGVsPC9lbT59Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWwKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETDJKYXZhRGF0YU1vZGVsQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbCA8ZW0+SW5zdGFsbDwvZW0+fScuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbAotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVDWEZJbnN0YWxsQWRhcHRlcigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfSAvL0NYRkFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL21vZGVsL3V0aWwvQ1hGU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjY2M2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9tb2RlbC91dGlsL0NYRlN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqICRJZDogQ1hGU3dpdGNoLmphdmEsdiAxLjIgMjAxMC8wMS8xNyAxOTo1Njo1NiBzY2xhcmtlIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLio7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0Ci0gKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKLSAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ1hGU3dpdGNoPFQ+IHsKLSAgICAvKioKLSAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIENYRlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBDWEZTd2l0Y2goKSB7Ci0gICAgICAgIGlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWxQYWNrYWdlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotICAgICAgICByZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLSAgICAgICAgaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIExpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotICAgICAgICAgICAgICAgICAgICBkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLSAgICAgICAgc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVDogewotICAgICAgICAgICAgICAgIENYRkNvbnRleHQgY3hmQ29udGV4dCA9IChDWEZDb250ZXh0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dChjeGZDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0RBVEFfTU9ERUw6IHsKLSAgICAgICAgICAgICAgICBDWEZEYXRhTW9kZWwgY3hmRGF0YU1vZGVsID0gKENYRkRhdGFNb2RlbCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZUNYRkRhdGFNb2RlbChjeGZEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoY3hmRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVDogewotICAgICAgICAgICAgICAgIEphdmEyV1NDb250ZXh0IGphdmEyV1NDb250ZXh0ID0gKEphdmEyV1NDb250ZXh0KXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlSmF2YTJXU0NvbnRleHQoamF2YTJXU0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkNvbnRleHQoamF2YTJXU0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19EQVRBX01PREVMOiB7Ci0gICAgICAgICAgICAgICAgSmF2YTJXU0RhdGFNb2RlbCBqYXZhMldTRGF0YU1vZGVsID0gKEphdmEyV1NEYXRhTW9kZWwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VKYXZhMldTRGF0YU1vZGVsKGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNYRkRhdGFNb2RlbChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKYXZhMldTQ29udGV4dChqYXZhMldTRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZDb250ZXh0KGphdmEyV1NEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQ6IHsKLSAgICAgICAgICAgICAgICBXU0RMMkphdmFDb250ZXh0IHdzZGwySmF2YUNvbnRleHQgPSAoV1NETDJKYXZhQ29udGV4dCl0aGVFT2JqZWN0OwotICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVdTREwySmF2YUNvbnRleHQod3NkbDJKYXZhQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dCh3c2RsMkphdmFDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9EQVRBX01PREVMOiB7Ci0gICAgICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIHdzZGwySmF2YURhdGFNb2RlbCA9IChXU0RMMkphdmFEYXRhTW9kZWwpdGhlRU9iamVjdDsKLSAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VXU0RMMkphdmFEYXRhTW9kZWwod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDWEZEYXRhTW9kZWwod3NkbDJKYXZhRGF0YU1vZGVsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXU0RMMkphdmFDb250ZXh0KHdzZGwySmF2YURhdGFNb2RlbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ1hGQ29udGV4dCh3c2RsMkphdmFEYXRhTW9kZWwpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfSU5TVEFMTDogewotICAgICAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IChDWEZJbnN0YWxsKXRoZUVPYmplY3Q7Ci0gICAgICAgICAgICAgICAgVCByZXN1bHQgPSBjYXNlQ1hGSW5zdGFsbChjeGZJbnN0YWxsKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZXh0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUNYRkNvbnRleHQoQ1hGQ29udGV4dCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VDWEZEYXRhTW9kZWwoQ1hGRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBDb250ZXh0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YTIgV1MgQ29udGV4dDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUphdmEyV1NDb250ZXh0KEphdmEyV1NDb250ZXh0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhMiBXUyBEYXRhIE1vZGVsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YTIgV1MgRGF0YSBNb2RlbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V1NETDIgSmF2YSBDb250ZXh0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBjYXNlV1NETDJKYXZhQ29udGV4dChXU0RMMkphdmFDb250ZXh0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XU0RMMiBKYXZhIERhdGEgTW9kZWw8L2VtPicuCi0gICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0gICAgICogQGdlbmVyYXRlZAotICAgICAqLwotICAgIHB1YmxpYyBUIGNhc2VXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnN0YWxsPC9lbT4nLgotICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gICAgICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0gICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5zdGFsbDwvZW0+Jy4KLSAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLSAgICAgKiBAZ2VuZXJhdGVkCi0gICAgICovCi0gICAgcHVibGljIFQgY2FzZUNYRkluc3RhbGwoQ1hGSW5zdGFsbCBvYmplY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLSAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLSAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotICAgICAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqIEBnZW5lcmF0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0gLy9DWEZTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL0phdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2M4ZTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL0phdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotCi0vKioKLSAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4gc3JjIGZvbGRlci4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0KLSAgICBwcml2YXRlIElQYXRoIHNvdXJjZURpcmVjdG9yeVBhdGg7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlRGlyZWN0b3J5UGF0aAotICAgICAqLwotICAgIHB1YmxpYyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihJUGF0aCBzb3VyY2VEaXJlY3RvcnlQYXRoKSB7Ci0gICAgICAgIHRoaXMuc291cmNlRGlyZWN0b3J5UGF0aCA9IHNvdXJjZURpcmVjdG9yeVBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJRm9sZGVyIHNyY0ZvbGRlciA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKHNvdXJjZURpcmVjdG9yeVBhdGgpOwotICAgICAgICBJUGF0aCBzcmNGb2xkZXJQYXRoID0gc3JjRm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIGlmICghc3JjRm9sZGVyUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICBzcmNGb2xkZXJQYXRoID0gc3JjRm9sZGVyUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlRGVsdGEgamF2YVJlc291cmNlRGVsdGEgPSByb290RGVsdGEuZmluZE1lbWJlcihzcmNGb2xkZXJQYXRoKTsKLQotICAgICAgICBpZiAoamF2YVJlc291cmNlRGVsdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLkFEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmFSZXNvdXJjZURlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8SVJlc291cmNlPiBnZXRDaGFuZ2VkUmVzb3VyY2VzKCkgewotICAgICAgICByZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvcmVzb3VyY2VzL1dlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvV2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MGIxY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS9yZXNvdXJjZXMvV2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIHRvIHRoZSB3ZWIgcHJvamVjdHMgV2ViQ29udGVudCBmb2xkZXIuCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gICAgCi0gICAgcHVibGljIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSAhPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElSZXNvdXJjZURlbHRhIHJvb3REZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLSAgICAgICAgSVBhdGggd2ViQ29udGVudFBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotICAgICAgICAgICAgICAgIC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgICAgIGlmICghd2ViQ29udGVudFBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgd2ViQ29udGVudFBhdGggPSB3ZWJDb250ZW50UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBJUmVzb3VyY2VEZWx0YSB3ZWJSZXNvdXJjZURlbHRhID0gcm9vdERlbHRhLmZpbmRNZW1iZXIod2ViQ29udGVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICh3ZWJSZXNvdXJjZURlbHRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3ZWJSZXNvdXJjZURlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NYRk1vZGVsVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ1hGTW9kZWxVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTI5NmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ1hGTW9kZWxVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlU3R5bGVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TaGFyZWRBU1RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlIENYRiBtb2RlbC4KLSAqIEFsc28gc2VydmluZyBhcyBhbiBpbnRlcmltIGNsYXNzIHRvIGFpZCBpbiByZWZhY3RvcmluZyBjb3JlIHV0aWxpdGllcyBpbnRvIGpheHdzIGNvcmUuCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ1hGTW9kZWxVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzBfMF8wID0gbmV3IFZlcnNpb24oIjAuMC4wIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbiB2XzJfMSA9IG5ldyBWZXJzaW9uKENYRkNvcmVQbHVnaW4uQ1hGX1ZFUlNJT05fMl8xKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8wXzcgPSBuZXcgVmVyc2lvbigiMi4wLjciKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZfMl8xXzEgPSBuZXcgVmVyc2lvbigiMi4xLjEiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWSUNFID0gIldlYlNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01FVEhPRCA9ICJXZWJNZXRob2QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNID0gIldlYlBhcmFtIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfV1JBUFBFUiA9ICJSZXF1ZXN0V3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9XUkFQUEVSID0gIlJlc3BvbnNlV3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0UgPSAiZW5kcG9pbnRJbnRlcmZhY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIlNlcnZpY2VNb2RlIiwgImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJGYXVsdCIsICJqYXZheC54bWwud3MuV2ViRmF1bHQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChSRVFVRVNUX1dSQVBQRVIsICJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoUkVTUE9OU0VfV1JBUFBFUiwgImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZUNsaWVudCIsICJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJXZWJFbmRwb2ludCIsICJqYXZheC54bWwud3MuV2ViRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZVByb3ZpZGVyIiwgImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiQmluZGluZ1R5cGUiLCAiamF2YXgueG1sLndzLkJpbmRpbmdUeXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlNlcnZpY2VSZWYiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiV2ViU2VydmljZVJlZnMiLCAiamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoV0VCX1NFUlZJQ0UsICJqYXZheC5qd3MuV2ViU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChXRUJfTUVUSE9ELCAiamF2YXguandzLldlYk1ldGhvZCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dCgiT25ld2F5IiwgImphdmF4Lmp3cy5PbmVXYXkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIEFOTk9UQVRJT05fVFlQRU5BTUVfTUFQLnB1dChXRUJfUEFSQU0sICJqYXZheC5qd3MuV2ViUGFyYW0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIldlYlJlc3VsdCIsICJqYXZheC5qd3MuV2ViUmVzdWx0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5wdXQoIlNPQVBCaW5kaW5nIiwgImphdmF4Lmp3cy5TT0FQQmluZGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAucHV0KCJIYW5kbGVyQ2hhaW4iLCAiamF2YXguandzLkhhbmRsZXJDaGFpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRk1vZGVsVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLQotICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlNlcnZpY2VBbm5vdGF0aW9uICE9IG51bGwgJiYgbW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSAmJiB0eXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlID0gZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VBbm5vdGF0aW9uLCBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwgJiYgZW5kcG9pbnRJbnRlcmZhY2UuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZ0xpdGVyYWwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSAoU3RyaW5nTGl0ZXJhbCkgZW5kcG9pbnRJbnRlcmZhY2UuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmluZ0xpdGVyYWwuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQVNUTm9kZSBuZXdTRUlWYWx1ZSA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdChlbmRwb2ludEludGVyZmFjZSwgbmV3U0VJVmFsdWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBlbmRwb2ludEludGVyZmFjZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVORFBPSU5UX0lOVEVSRkFDRSwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRNZW1iZXJWYWx1ZVBhaXJUZXh0RWRpdCh3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2VQYWlyKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoV2ViU2VydmljZS5jbGFzcykuCi0gICAgICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRNZW1iZXJWYWx1ZVBhaXJzKHR5cGUsIGFzdCwKLSAgICAgICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIHR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UsIG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoMSwgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZVBhaXIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTm9ybWFsQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKElUeXBlIHR5cGUsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb24gamR0QW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIGFubm90YXRpb24pOwotICAgICAgICBpZiAoamR0QW5ub3RhdGlvbiAhPSBudWxsICYmIGpkdEFubm90YXRpb24gaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE5vcm1hbEFubm90YXRpb24pIGpkdEFubm90YXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKG1ldGhvZCwgYXN0LCBXZWJNZXRob2QuY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uQ2hhbmdlKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotCi0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihtZXRob2QsIGFzdCwgUmVxdWVzdFdyYXBwZXIuY2xhc3MpOwotCi0gICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCwKLSAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICBBU1QgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24obWV0aG9kLCBhc3QsIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0KLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRXZWJQYXJhbUFubm90YXRpb25DaGFuZ2UoSVR5cGUgdHlwZSwgZmluYWwgSU1ldGhvZCBtZXRob2QsCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIsIFRleHRGaWxlQ2hhbmdlIHRleHRGaWxlQ2hhbmdlKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0KLSAgICAgICAgQVNUIGFzdCA9IGNvbXBpbGF0aW9uVW5pdC5nZXRBU1QoKTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKHBhcmFtZXRlciwgYXN0LCBXZWJQYXJhbS5jbGFzcyk7Ci0KLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHBhcmFtZXRlciwgYW5ub3RhdGlvbikpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotCi0gICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gQW5ub3RhdGlvbnNNYW5hZ2VyLgotICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MpLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0KLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhqYXZhRWxlbWVudCwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZXRJbXBvcnRzQ2hhbmdlKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UsIGJvb2xlYW4gY2xhc3NPbmx5KSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotCi0gICAgICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5nZXQoV0VCX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgaWYgKCFjbGFzc09ubHkpIHsKLSAgICAgICAgICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKTsKLSAgICAgICAgICAgICAgICBTZXQ8RW50cnk8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+PiBtZXRob2RBbm5vdGF0aW9uU2V0ID0gbWV0aG9kQW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RBbm5vdGF0aW9uIDogbWV0aG9kQW5ub3RhdGlvblNldCkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBtZXRob2RNYXAgPSBtZXRob2RBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RTZXQgPSBtZXRob2RNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb29sZWFuPiBtZXRob2QgOiBtZXRob2RTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBTk5PVEFUSU9OX1RZUEVOQU1FX01BUC5jb250YWluc0tleShtZXRob2QuZ2V0S2V5KCkpICYmIG1ldGhvZC5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmV3cml0ZS5hZGRJbXBvcnQoQU5OT1RBVElPTl9UWVBFTkFNRV9NQVAuZ2V0KG1ldGhvZC5nZXRLZXkoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgVGV4dEVkaXQgaW1wb3J0VGV4dEVkaXQgPSBpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KGltcG9ydFRleHRFZGl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgYWxsIHB1YmxpYyBtZXRob2RzIHdpdGggdGhlIGRlZmF1bHQgYW5ub3RhdGlvbiBtYXBzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBnZXRNZXRob2RNYXAoSVR5cGUgdHlwZSwgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PigpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJTWV0aG9kW10gbWV0aG9kcyA9IHR5cGUuZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kLCBnZXRBbm5vdGF0aW9uTWFwKG1vZGVsKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQ2xhc3MoKSAmJiBKRFRVdGlscy5pc1B1YmxpY01ldGhvZChtZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kLCBnZXRBbm5vdGF0aW9uTWFwKG1vZGVsKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RNYXA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBCb29sZWFuPiBnZXRBbm5vdGF0aW9uTWFwKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gYW5ub3RhdGlvbmRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJvb2xlYW4+KCk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIG1vZGVsLmlzR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkpOwotICAgICAgICBhbm5vdGF0aW9uZE1hcC5wdXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIG1vZGVsLmlzR2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oKSk7Ci0gICAgICAgIGFubm90YXRpb25kTWFwLnB1dChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgYW5ub3RhdGlvbmRNYXAucHV0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUiwgbW9kZWwuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDWEYgd3NkbDJqYXZhIC1hdXRvTmFtZVJlc29sdXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBDWEYgMi4wIHN0cmVhbSBmcm9tIDIuMC43Ci0gICAgICogYW5kIGluIHRoZSBDWEYgMi4xIHN0cmVhbSBmcm9tIDIuMS4xIHVwLgotICAgICAqCi0gICAgICogQHBhcmFtIGN4ZlJ1bnRpbWVWZXJzaW9uCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpIHsKLSAgICAgICAgVmVyc2lvbiBjdXJyZW50VmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEN1cnJlbnRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICAvL09uIHN0YXJ0dXAgd2l0aCBjbGVhbiB3b3Jrc3BhY2Ugc2hvdyBieSBkZWZhdWx0LgotICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uY29tcGFyZVRvKHZfMF8wXzApID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyhDWEZNb2RlbFV0aWxzLnZfMl8xXzEpID49IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRWZXJzaW9uLmNvbXBhcmVUbyhDWEZNb2RlbFV0aWxzLnZfMl8wXzcpID49IDAKLSAgICAgICAgICAgICAgICAmJiBjdXJyZW50VmVyc2lvbi5jb21wYXJlVG8oQ1hGTW9kZWxVdGlscy52XzJfMSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRCb29sZWFuVmFsdWUoaW50IGNsYXNzaWZpZXJJRCwgaW50IGZlYXR1cmVJRCkgewotICAgICAgICBPYmplY3QgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQotICAgICAgICBpZiAoY2xhc3NpZmllcklEID09IENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX1ZFUkJPU0U6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q1hGQ29udGV4dF9WZXJib3NlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX0FOVF9CVUlMRF9GSUxFOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVBbnRCdWlsZEZpbGUoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfVXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVDbGllbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldENYRkNvbnRleHRfR2VuZXJhdGVTZXJ2ZXIoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGFzc2lmaWVySUQgPT0gQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgewotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19FTkFCTEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkc6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfU29hcDEyQmluZGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1hTRF9JTVBPUlRTOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmEyV1NDb250ZXh0X0dlbmVyYXRlWFNESW1wb3J0cygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dSQVBQRVJfRkFVTFRfQkVBTlM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdTREwoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfTUVUSE9EX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVXZWJNZXRob2RBbm5vdGF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9XRUJfUEFSQU1fQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfUkVRVUVTVF9XUkFQUEVSX0FOTk9UQVRJT046Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YTJXU0NvbnRleHRfR2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFU1BPTlNFX1dSQVBQRVJfQU5OT1RBVElPTjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhMldTQ29udGV4dF9HZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsYXNzaWZpZXJJRCA9PSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCkgewotICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X05vQWRkcmVzc0JpbmRpbmcoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1VzZURlZmF1bHRWYWx1ZXMoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfQXV0b05hbWVSZXNvbHV0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19QUk9DRVNTX1NPQVBfSEVBREVSUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1Byb2Nlc3NTT0FQSGVhZGVycygpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9BTlRfQlVJTERfRklMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRDWEZDb250ZXh0X0dlbmVyYXRlQW50QnVpbGRGaWxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19WQUxJREFURToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1ZhbGlkYXRlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V1NETDJKYXZhQ29udGV4dF9Mb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1VTRV9ERUZBVUxUX1ZBTFVFUzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1VzZURlZmF1bHRWYWx1ZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORzoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkU6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNUb1N0cmluZ011bHRpTGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRToKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY1RvU3RyaW5nU2ltcGxlKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUjoKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDWEZQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMMkphdmFDb250ZXh0X1hqY0xvY2F0b3IoKS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFM6Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ1hGUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETDJKYXZhQ29udGV4dF9YamNTeW5jTWV0aG9kcygpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX01BUktfR0VORVJBVEVEOgotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IENYRlBhY2thZ2UuZUlOU1RBTkNFLmdldFdTREwySmF2YUNvbnRleHRfWGpjTWFya0dlbmVyYXRlZCgpLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmIGRlZmF1bHRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJvb2xlYW4pIGRlZmF1bHRWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL0NvbW1hbmRMaW5lVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkzMjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvQ29tbWFuZExpbmVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21tYW5kTGluZVV0aWxzIHsKLSAgICAvLyBKYXZhMldTREwKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1VUX0ZJTEUgPSAiLW8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX0RJUiA9ICItZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU09VUkNFX0RJUiA9ICItcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRElSID0gIi1jbGFzc2RpciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0NMQVNTUEFUSCA9ICItY3AiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElOQ19TT0FQMTIgPSAiLXNvYXAxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRSA9ICItdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX1NFUlZJQ0VfTkFNRSA9ICItc2VydmljZW5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBPUlRfTkFNRSA9ICItcG9ydG5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9YU0RfSU1QT1JUUyA9ICItY3JlYXRleHNkaW1wb3J0cyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVkVSQk9TRSA9ICItdmVyYm9zZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIEphdmEyV1MKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0ZST05URU5EID0gIi1mcm9udGVuZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSjJXX0RBVEFCSU5ESU5HID0gIi1kYXRhYmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgQkVBTl9QQVRIID0gIi1iZWFucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1dTREwgPSAiLXdzZGwiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEdFTl9DTElFTlQgPSAiLWNsaWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgR0VOX1NFUlZFUiA9ICItc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBHRU5fV1JBUFBFUl9GQVVMVCA9ICItd3JhcHBlcmJlYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1BBQ0tBR0VfTkFNRSA9ICItcCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0JJTkRJTkdfTkFNRSA9ICItYiI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRlJPTlRFTkQgPSAiLWZlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREFUQUJJTkRJTkcgPSAiLWRiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9WRVJTSU9OID0gIi13diI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1NFUlZJQ0VfTkFNRSA9ICItc24iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9DQVRBTE9HID0gIi1jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfQ09NUElMRSA9ICItY29tcGlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0dFTl9JTVBMID0gIi1pbXBsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfR0VOX0FMTCA9ICItYWxsIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfTk9fT1ZFUldSSVRFID0gIi1rZWVwIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9WQUxVRVMgPSAiLWRlZmF1bHRWYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFcySl9BVVRPX05BTUVfUkVTT0xVVElPTiA9ICItYXV0b05hbWVSZXNvbHV0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhDTFVERV9OQU1FU1BBQ0UgPSAiLW5leGNsdWRlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfRVhUX1NPQVBfSEVBREVSID0gIi1leHNoIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfREVGQVVMVF9OQU1FU1BBQ0UgPSAiLWRucyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX0RFRkFVTFRfRVhDTFVERV9OUyA9ICItZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfV1NETF9MT0NBVElPTiA9ICItd3NkbExvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBXMkpfWEpDX0FSR1MgPSAiLXhqYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX05PX0FERFJFU1NfQklORElORyA9ICItbm9BZGRyZXNzQmluZGluZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVzJKX1ZBTElEQVRFX1dTREwgPSAiLXZhbGlkYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gWEpDCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19EVl9BUkcgPSAiLVhkdiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX0FSRyA9ICItWHRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfTVVMVElfQVJHID0gIi1YdHM6c3R5bGU6bXVsdGlsaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfU0lNUExFID0gIi1YdHM6c3R5bGU6c2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUl9BUkcgPSAiLVhsb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTX0FSRyA9ICItWHN5bmMtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEX0FSRyA9ICItbWFyay1nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfQVJHID0gIi1lcGlzb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBDb21tYW5kTGluZVV0aWxzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VVdGlscy5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpOwotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgJiYgbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWFybGllciB3c2RsMmphdmEgdG9vbCBvcHRpb25zCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFN0YW5kYXJkSmF2YTJXU0RMUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCkpKTsKLQotICAgICAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChKMldfRlJPTlRFTkQpOwotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChtb2RlbC5nZXRGcm9udGVuZCgpLmdldExpdGVyYWwoKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoSjJXX0RBVEFCSU5ESU5HKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RGF0YWJpbmRpbmcoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKEJFQU5fUEFUSCk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvZ0FyZ3MuYWRkKCJCRUFOX1BBVEgiKTsKLQotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fV1NETCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKE9VVF9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MucmVtb3ZlKG1vZGVsLmdldFdzZGxGaWxlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUNsaWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fQ0xJRU5UKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fU0VSVkVSKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9XUkFQUEVSX0ZBVUxUKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0U3RhbmRhcmRKYXZhMldTRExQcm9ncmFtQXJndW1lbnRzKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHByb2dBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChKMldfQ0xBU1NQQVRIKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvc3JjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoUkVTT1VSQ0VfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEZpbGVVdGlscy5nZXRUbXBGb2xkZXIocHJvamVjdE5hbWUpICsgIi93c2RsIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoQ0xBU1NfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoT1VUX0ZJTEUpOwotICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKElOQ19TT0FQMTIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoR0VOX1hTRF9JTVBPUlRTKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc1ZlcmJvc2UoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFZFUkJPU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIC8vIEFkZCBTdGFuZGFyZCBhcmdzCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFN0YW5kYXJkV1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWUpKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VOYW1lKCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCAmJiBzZXJ2aWNlTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1vZGVsLmlzVXNlRGVmYXVsdFZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9ERUZBVUxUX1ZBTFVFUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0ZST05URU5EKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9EQVRBQklORElORyk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLQotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfV1NETF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQobW9kZWwuZ2V0V3NkbFZlcnNpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNOb0FkZHJlc3NCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9OT19BRERSRVNTX0JJTkRJTkcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvZ0FyZ3MudG9BcnJheShuZXcgU3RyaW5nW3Byb2dBcmdzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0V1NETDJKYXZhR2VuZXJhdGVDbGllbnRBcmd1bWVudHMoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBwcm9nQXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWxzLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIEpEVFV0aWxzLmlzSmF2YVByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChHRU5fQ0xJRU5UKTsKLQotICAgICAgICAgICAgLy8gQWRkIFdTTEQySmF2YSBhcmdzCi0gICAgICAgICAgICBwcm9nQXJncy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDb21tYW5kTGluZVV0aWxzLmdldFdTREwySmF2YVByb2dyYW1Bcmd1bWVudHMobW9kZWwpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHByb2dBcmdzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9nQXJncy5zaXplKCldKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFN0YW5kYXJkV1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gcHJvZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKFJFU09VUkNFX0RJUik7Ci0gICAgICAgIHByb2dBcmdzLmFkZChGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKHByb2plY3ROYW1lKSArICIvc3JjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBwcm9nQXJncy5hZGQoQ0xBU1NfRElSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChwcm9qZWN0TmFtZSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluY2x1ZGVkTmFtZXNwYWNlcyA9IG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpOwotICAgICAgICBpZiAoaW5jbHVkZWROYW1lc3BhY2VzICE9IG51bGwgJiYgbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgU2V0PE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGluY2x1ZGVkTmFtZXNwYWNlc0VudHJ5U2V0ID0gaW5jbHVkZWROYW1lc3BhY2VzLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBpbmNsdWRlZE5hbWVzcGFjZXNFbnRyeVNldCkgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbE5hbWVzcGFjZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKHdzZGxOYW1lc3BhY2UgKyAiPSIgKyBwYWNrYWdlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8U3RyaW5nPiBiaW5kaW5nRmlsZXMgPSBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKTsKLSAgICAgICAgaWYgKCFiaW5kaW5nRmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBiaW5kaW5nRmlsZSA6IGJpbmRpbmdGaWxlcykgewotICAgICAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfQklORElOR19OQU1FKTsKLSAgICAgICAgICAgICAgICBwcm9nQXJncy5hZGQoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVTZXJ2ZXIoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKEdFTl9TRVJWRVIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0dFTl9JTVBMKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKG1vZGVsLmlzVmFsaWRhdGUoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9WQUxJREFURV9XU0RMKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2dBcmdzLmFkZChXMkpfRVhUX1NPQVBfSEVBREVSKTsKLSAgICAgICAgcHJvZ0FyZ3MuYWRkKEJvb2xlYW4udG9TdHJpbmcobW9kZWwuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSkpOwotCi0gICAgICAgIHByb2dBcmdzLmFkZChXMkpfREVGQVVMVF9OQU1FU1BBQ0UpOwotICAgICAgICBwcm9nQXJncy5hZGQoQm9vbGVhbi50b1N0cmluZyhtb2RlbC5pc0xvYWREZWZhdWx0TmFtZXNwYWNlUGFja2FnZU5hbWVNYXBwaW5nKCkpKTsKLQotICAgICAgICBwcm9nQXJncy5hZGQoVzJKX0RFRkFVTFRfRVhDTFVERV9OUyk7Ci0gICAgICAgIHByb2dBcmdzLmFkZChCb29sZWFuLnRvU3RyaW5nKG1vZGVsLmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSkpOwotCi0gICAgICAgIGlmIChtb2RlbC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFcySl9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgeGpjQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0WEpDQXJncyhtb2RlbCk7Ci0gICAgICAgIGlmICh4amNBcmdzLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2dBcmdzLmFkZChXMkpfWEpDX0FSR1MgKyB4amNBcmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5nZXRXc2RsTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm9nQXJncy5hZGQoVzJKX1dTRExfTE9DQVRJT04pOwotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKG1vZGVsLmdldFdzZGxMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RlbC5pc1ZlcmJvc2UoKSkgewotICAgICAgICAgICAgcHJvZ0FyZ3MuYWRkKFZFUkJPU0UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9nQXJncy50b0FycmF5KG5ldyBTdHJpbmdbcHJvZ0FyZ3Muc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFhKQ0FyZ3MoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB4amNBcmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX0RWX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmcoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX01VTFRJX0FSRyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjVG9TdHJpbmdTaW1wbGUoKSkgewotICAgICAgICAgICAgeGpjQXJncy5hZGQoWEpDX1RTX1NJTVBMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmlzWGpjTG9jYXRvcigpKSB7Ci0gICAgICAgICAgICB4amNBcmdzLmFkZChYSkNfTE9DQVRPUl9BUkcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlbC5pc1hqY1N5bmNNZXRob2RzKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19TWU5DX01FVEhPRFNfQVJHKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNYamNNYXJrR2VuZXJhdGVkKCkpIHsKLSAgICAgICAgICAgIHhqY0FyZ3MuYWRkKFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHhqY0FyZyA9IHhqY0FyZ3MudG9TdHJpbmcoKTsKLSAgICAgICAgeGpjQXJnID0geGpjQXJnLnJlcGxhY2UoJ1snLCAnICcpOwotICAgICAgICB4amNBcmcgPSB4amNBcmcucmVwbGFjZSgnXScsICcgJyk7Ci0KLSAgICAgICAgeGpjQXJnID0geGpjQXJnLnJlcGxhY2VBbGwoIlxccyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgcmV0dXJuIHhqY0FyZy50cmltKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGM5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVVdGlscyB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QX0ZPTERFUl9OQU1FID0gIi5jeGZ0bXAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEZpbGVVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGdldFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZvbGRlcihTdHJpbmcgc291cmNlLCBTdHJpbmcgZGVzdGluYXRpb24pIHsKLSAgICAgICAgRmlsZSBzb3VyY2VGb2xkZXIgPSBuZXcgRmlsZShzb3VyY2UpOwotCi0gICAgICAgIFN0cmluZ1tdIGZpbGVzID0gc291cmNlRm9sZGVyLmxpc3QoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc291cmNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgY29weUZvbGRlcihzb3VyY2UsIGRlc3RpbmF0aW9uLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvcHlGaWxlKHNvdXJjZSwgZGVzdGluYXRpb24sIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weUZvbGRlcihTdHJpbmcgc291cmNlRm9sZGVyLCBTdHJpbmcgdGFyZ2V0Rm9sZGVyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBGaWxlIHRhcmdldCA9IG5ldyBGaWxlKHRhcmdldEZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7Ci0gICAgICAgIGlmICghdGFyZ2V0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0YXJnZXQubWtkaXIoKTsKLSAgICAgICAgfQotICAgICAgICBjb3B5Rm9sZGVyKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSwgdGFyZ2V0Rm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUZpbGUoU3RyaW5nIHNvdXJjZUZvbGRlciwgU3RyaW5nIHRhcmdldEZvbGRlciwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0gICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZvbGRlciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpOwotICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXRGb2xkZXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLSAgICAgICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIAlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0JCSAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0MDBdOwotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZkJ5dGVzID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVtYmVyT2ZCeXRlcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIG51bWJlck9mQnl0ZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhmbmZlKTsKLQkJICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOyAgICAKLQkJCQkgICAgfQotCQkJCSAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkgICAgICAgIG91dHB1dFN0cmVhbS5jbG9zZSgpOyAgICAKLQkJCQkgICAgfQotCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQkJfQotCQkJfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIi5qYXZhIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIE1lcmdlVXRpbHMubWVyZ2Uoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUbXBGb2xkZXJOYW1lKCkgewotICAgICAgICByZXR1cm4gVE1QX0ZPTERFUl9OQU1FOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUbXBGb2xkZXIoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBGaWxlVXRpbHMuZ2V0VG1wRm9sZGVyKEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG1wRm9sZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgSUZvbGRlciB0bXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihUTVBfRk9MREVSX05BTUUpOwotICAgICAgICBpZiAoIXRtcEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZvbGRlciB0bXBTcmNGb2xkZXIgPSB0bXBGb2xkZXIuZ2V0Rm9sZGVyKCJzcmMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoIXRtcFNyY0ZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBTcmNGb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSUZvbGRlciB0bXBXU0RMRm9sZGVyID0gdG1wRm9sZGVyLmdldEZvbGRlcigid3NkbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmICghdG1wV1NETEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0bXBXU0RMRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRtcEZvbGRlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVcySkZpbGVzRnJvbVRtcChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgSUZvbGRlciBzcmNGb2xkZXIgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihuZXcgUGF0aChtb2RlbC5nZXRKYXZhU291cmNlRm9sZGVyKCkpKTsKLSAgICAgICAgRmlsZVV0aWxzLmNvcHlGb2xkZXIoZ2V0VG1wRm9sZGVyKHByb2plY3QpICsgIi9zcmMiLCBzcmNGb2xkZXIuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNyY0ZvbGRlci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZVRtcEZvbGRlcihwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weUoyV0ZpbGVzRnJvbVRtcChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0KLSAgICAgICAgSVR5cGUgdHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIElSZXNvdXJjZSBqYXZhRWxlbWVudFJlc291cmNlID0gamF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50UmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElGb2xkZXIgc3JjRGlyZWN0b3J5ID0gKElGb2xkZXIpIGphdmFFbGVtZW50UmVzb3VyY2U7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlGb2xkZXIoZ2V0VG1wRm9sZGVyKHByb2plY3QpICsgIi9zcmMiLCBzcmNEaXJlY3RvcnkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgc3JjRGlyZWN0b3J5LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVdTREwoKSkgewotICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5Rm9sZGVyKGdldFRtcEZvbGRlcihwcm9qZWN0KSArICIvd3NkbCIsIHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldENvbmZpZ1dzZGxMb2NhdGlvbih3c2RsRm9sZGVyLmdldE5hbWUoKSArICIvIiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBkZWxldGVUbXBGb2xkZXIocHJvamVjdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBkZWxldGVUbXBGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgSUZvbGRlciB0bXBGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihUTVBfRk9MREVSX05BTUUpOwotICAgICAgICBpZiAodG1wRm9sZGVyLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRtcEZvbGRlci5kZWxldGUodHJ1ZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVJbldlYkNvbnRlbnRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKLSAgICAJSVBhdGggd2ViQ29udGVudFBhdGggPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgIAlpZiAod2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmaWxlUGF0aCkpIHsKLSAgICAgICAJCXJldHVybiB0cnVlOwotICAgIAl9Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZUluV29ya3NwYWNlKFVSTCBmaWxlVVJMKSB7Ci0gICAgICAgIElQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZVVSTC5nZXRQYXRoKCkpOwotCi0gICAgICAgIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICBJUGF0aCB3b3Jrc3BhY2VQYXRoID0gd29ya3NwYWNlUm9vdC5nZXRMb2NhdGlvbigpOwotICAgICAgICBpZiAoZmlsZVBhdGguaXNWYWxpZFBhdGgod29ya3NwYWNlUGF0aC50b09TU3RyaW5nKCkpKSB7Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFhNTEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGVudERlc2NyaXB0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmdldEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdFByb2Nlc3Nvci5mb3JtYXRGaWxlKGZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdCwgbW9uaXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9MYXVuY2hVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjM0NDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvTGF1bmNoVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1SdW5uZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuSUNvbnNvbGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JQ29uc29sZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5JT0NvbnNvbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29uc29sZS5NZXNzYWdlQ29uc29sZTsKLQotcHVibGljIGZpbmFsIGNsYXNzIExhdW5jaFV0aWxzIHsKLQotICAgIHByaXZhdGUgTGF1bmNoVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGxhdW5jaChTdHJpbmdbXSBydW50aW1lQ2xhc3NwYXRoLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdbXSBwcm9ncmFtQXJncykgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgICAgIElWTVJ1bm5lciB2bVJ1bm5lciA9IHZtSW5zdGFsbC5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0gICAgICAgICAgICBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1SdW5uZXJDb25maWd1cmF0aW9uID0gbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbihjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzc3BhdGgpOwotICAgICAgICAgICAgdm1SdW5uZXJDb25maWd1cmF0aW9uLnNldFByb2dyYW1Bcmd1bWVudHMocHJvZ3JhbUFyZ3MpOwotCi0gICAgICAgICAgICBJTGF1bmNoIGxhdW5jaCA9IG5ldyBMYXVuY2gobnVsbCwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIG51bGwpOwotICAgICAgICAgICAgdm1SdW5uZXIucnVuKHZtUnVubmVyQ29uZmlndXJhdGlvbiwgbGF1bmNoLCBudWxsKTsKLQotICAgICAgICAgICAgd2hpbGUgKCFsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUHJvY2Vzc1tdIHByb2Nlc3NlcyA9IGxhdW5jaC5nZXRQcm9jZXNzZXMoKTsKLSAgICAgICAgICAgIFN0cmluZyBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwgJiYgb3V0cHV0U3RyZWFtLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbGF1bmNoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nW10gcHJvZ3JhbUFyZ3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGwoamF2YVByb2plY3QpOwotICAgICAgICBpZiAodm1JbnN0YWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHZtSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBpbnN0YWxsZWRWZXJzaW9uID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q1hGUnVudGltZVZlcnNpb24oamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGluc3RhbGxlZFZlcnNpb24pOwotCi0gICAgICAgIElWTVJ1bm5lciB2bVJ1bm5lciA9IHZtSW5zdGFsbC5nZXRWTVJ1bm5lcihJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7Ci0gICAgICAgIFN0cmluZ1tdIHJ1bnRpbWVDbGFzc3BhdGggPSBKYXZhUnVudGltZS5jb21wdXRlRGVmYXVsdFJ1bnRpbWVDbGFzc1BhdGgoamF2YVByb2plY3QpOwotICAgICAgICBWTVJ1bm5lckNvbmZpZ3VyYXRpb24gdm1SdW5uZXJDb25maWd1cmF0aW9uID0gbmV3IFZNUnVubmVyQ29uZmlndXJhdGlvbihjbGFzc05hbWUsIHJ1bnRpbWVDbGFzc3BhdGgpOwotCi0gICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRQcm9ncmFtQXJndW1lbnRzKHByb2dyYW1BcmdzKTsKLQotICAgICAgICBpZiAodm1JbnN0YWxsIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKLSAgICAgICAgICAgIElWTUluc3RhbGwyIGluc3RhbGwyID0gKElWTUluc3RhbGwyKSB2bUluc3RhbGw7Ci0gICAgICAgICAgICBpZiAoaW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHZtUnVubmVyQ29uZmlndXJhdGlvbi5zZXRWTUFyZ3VtZW50cyhuZXcgU3RyaW5nW10geyAiLURqYXZhLmVuZG9yc2VkLmRpcnM9IiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICArIGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKSB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElMYXVuY2ggbGF1bmNoID0gbmV3IExhdW5jaChudWxsLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgbnVsbCk7Ci0gICAgICAgIHZtUnVubmVyLnJ1bih2bVJ1bm5lckNvbmZpZ3VyYXRpb24sIGxhdW5jaCwgbnVsbCk7Ci0KLSAgICAgICAgd2hpbGUgKCFsYXVuY2guaXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKGllKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIElQcm9jZXNzW10gcHJvY2Vzc2VzID0gbGF1bmNoLmdldFByb2Nlc3NlcygpOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXRTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0T3V0cHV0U3RyZWFtTW9uaXRvcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIGxvZ1N0cmVhbShvdXRwdXRTdHJlYW0sIGN4Zkluc3RhbGwpOwotICAgICAgICBTdHJpbmcgZXJyb3JTdHJlYW0gPSBwcm9jZXNzZXNbMF0uZ2V0U3RyZWFtc1Byb3h5KCkuZ2V0RXJyb3JTdHJlYW1Nb25pdG9yKCkuZ2V0Q29udGVudHMoKTsKLSAgICAgICAgbG9nU3RyZWFtKGVycm9yU3RyZWFtLCBjeGZJbnN0YWxsKTsKLQotICAgICAgICBsb2dFcnJvclN0cmVhbUNvbnRlbnRzKGVycm9yU3RyZWFtLCBjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nU3RyZWFtKFN0cmluZyBvdXRwdXRTdHJlYW0sIENYRkluc3RhbGwgY3hmSW5zdGFsbCkgewotICAgICAgICBpZiAoIVBsYXRmb3JtVUkuaXNXb3JrYmVuY2hSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgTWVzc2FnZUNvbnNvbGUgY3hmQ29uc29sZSA9IGdldENYRkNvbnNvbGUoY3hmSW5zdGFsbCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICAgICAgICAgIGlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjb25zb2xlX3ZpZXdfaWQgPSBJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVc7Ci0gICAgICAgICAgICAgICAgSUNvbnNvbGVWaWV3IGNvbnNvbGVWaWV3ID0gKElDb25zb2xlVmlldykgd29ya2JlbmNoUGFnZS5zaG93Vmlldyhjb25zb2xlX3ZpZXdfaWQpOwotICAgICAgICAgICAgICAgIGNvbnNvbGVWaWV3LmRpc3BsYXkoY3hmQ29uc29sZSk7Ci0gICAgICAgICAgICAgICAgSU9Db25zb2xlT3V0cHV0U3RyZWFtIGNvbnNvbGVPdXRwdXRTdHJlYW0gPSBjeGZDb25zb2xlLm5ld091dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgIGNvbnNvbGVPdXRwdXRTdHJlYW0ud3JpdGUob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb25zb2xlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2cocGllKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUNvbnNvbGUgZ2V0Q1hGQ29uc29sZShDWEZJbnN0YWxsIGN4Zkluc3RhbGwpIHsKLSAgICAgICAgQ29uc29sZVBsdWdpbiBjb25zb2xlUGx1Z2luID0gQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElDb25zb2xlTWFuYWdlciBjb25zb2xlTWFuYWdlciA9IGNvbnNvbGVQbHVnaW4uZ2V0Q29uc29sZU1hbmFnZXIoKTsKLSAgICAgICAgSUNvbnNvbGVbXSBleGlzdGluZ0NvbnNvbGVzID0gY29uc29sZU1hbmFnZXIuZ2V0Q29uc29sZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGlzdGluZ0NvbnNvbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZXhpc3RpbmdDb25zb2xlc1tpXS5nZXROYW1lKCkuZXF1YWxzKGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgICAgICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChNZXNzYWdlQ29uc29sZSkgZXhpc3RpbmdDb25zb2xlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlQ29uc29sZSBjeGZDb25zb2xlID0gbmV3IE1lc3NhZ2VDb25zb2xlKGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiCi0gICAgICAgICAgICAgICAgKyBjeGZJbnN0YWxsLmdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgImljb25zL3ZpZXcxNi9jb25zb2xlX3ZpZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbnNvbGVNYW5hZ2VyLmFkZENvbnNvbGVzKG5ldyBJQ29uc29sZVtde2N4ZkNvbnNvbGV9KTsKLSAgICAgICAgcmV0dXJuIGN4ZkNvbnNvbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dFcnJvclN0cmVhbUNvbnRlbnRzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIFN0cmluZyB0b29sTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5sZW5ndGgoKSk7Ci0KLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmluZGV4T2YodG9vbE5hbWUgKyAiIEVycm9yIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgU3RhdHVzIHRvb2xTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4ubG9nKHRvb2xTdGF0dXMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY29yZS91dGlscy9NZXJnZVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL01lcmdlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyYjE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL01lcmdlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5KQ29udHJvbE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLm1lcmdlLmphdmEuSk1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5tZXJnZS5qYXZhLmZhY2FkZS5GYWNhZGVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4ubWVyZ2UuamF2YS5mYWNhZGUuSkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi51dGlsLkNvZGVHZW5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVyZ2VVdGlscyB7Ci0KLSAgICBwcml2YXRlIE1lcmdlVXRpbHMoKSB7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBKTWVyZ2VyIGdldEpNZXJnZXIoKSB7Ci0gICAgICAgIEZhY2FkZUhlbHBlciBmYWNhZGVIZWxwZXIgPSBDb2RlR2VuVXRpbC5pbnN0YW50aWF0ZUZhY2FkZUhlbHBlcihKTWVyZ2VyLkRFRkFVTFRfRkFDQURFX0hFTFBFUl9DTEFTUyk7Ci0gICAgICAgIFVSTCBtZXJnZUZpbGVVUkwgPSBGaWxlTG9jYXRvci5maW5kKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLCBuZXcgUGF0aCgKLSAgICAgICAgICAgICAgICAiL2ptZXJnZXIvbWVyZ2UueG1sIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpDb250cm9sTW9kZWwgY29udHJvbE1vZGVsID0gbmV3IEpDb250cm9sTW9kZWwoKTsKLSAgICAgICAgY29udHJvbE1vZGVsLmluaXRpYWxpemUoZmFjYWRlSGVscGVyLCBtZXJnZUZpbGVVUkwudG9TdHJpbmcoKSk7Ci0gICAgICAgIEpNZXJnZXIgam1lcmdlciA9IG5ldyBKTWVyZ2VyKGNvbnRyb2xNb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIGptZXJnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlKEZpbGUgc291cmNlRmlsZSwgRmlsZSB0YXJnZXRGaWxlKSB7Ci0gICAgICAgIEpNZXJnZXIgbWVyZ2VyID0gZ2V0Sk1lcmdlcigpOwotCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzb3VyY2VJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSB0YXJnZXRJbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSB0YXJnZXRPdXRwdXRTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gc2V0IHNvdXJjZQotICAgICAgICAgICAgc291cmNlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpOwotICAgICAgICAgICAgSkNvbXBpbGF0aW9uVW5pdCBpbnB1dENvbXBpbGF0aW9uVW5pdCA9IG1lcmdlcgotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ29tcGlsYXRpb25Vbml0Rm9ySW5wdXRTdHJlYW0oc291cmNlSW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgbWVyZ2VyLnNldFNvdXJjZUNvbXBpbGF0aW9uVW5pdChpbnB1dENvbXBpbGF0aW9uVW5pdCk7Ci0KLSAgICAgICAgICAgIC8vIHNldCB0YXJnZXQKLSAgICAgICAgICAgIHRhcmdldElucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIEpDb21waWxhdGlvblVuaXQgdGFyZ2V0Q29tcGlsYXRpb25Vbml0ID0gbWVyZ2VyCi0gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDb21waWxhdGlvblVuaXRGb3JJbnB1dFN0cmVhbSh0YXJnZXRJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBtZXJnZXIuc2V0VGFyZ2V0Q29tcGlsYXRpb25Vbml0KHRhcmdldENvbXBpbGF0aW9uVW5pdCk7Ci0KLSAgICAgICAgICAgIC8vIG1lcmdlIHNvdXJjZSBhbmQgdGFyZ2V0Ci0gICAgICAgICAgICBtZXJnZXIubWVyZ2UoKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgbWVyZ2VkIGNvbnRlbnRzCi0gICAgICAgICAgICB0YXJnZXRPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG1lcmdlci5nZXRUYXJnZXRDb21waWxhdGlvblVuaXQoKS5nZXRDb250ZW50cygpLmdldEJ5dGVzKCk7Ci0gICAgICAgICAgICB0YXJnZXRPdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhmbmZlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlSW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzb3VyY2VJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRJbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvU3ByaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NvcmUvdXRpbHMvU3ByaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxOTk4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jb3JlL3V0aWxzL1NwcmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5qZG9tLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuamRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcuamRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy5qZG9tLkpET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpkb20uTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5qZG9tLmlucHV0LlNBWEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmpkb20ub3V0cHV0LlhNTE91dHB1dHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBTcHJpbmdVdGlscyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTmFtZXNwYWNlIFNQUklOR19CRUFOU19OUyA9IE5hbWVzcGFjZQotICAgIC5nZXROYW1lc3BhY2UoImh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBYTUxOU19YU0kgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJ4c2kiLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgcHJpdmF0ZSBzdGF0aWMgTmFtZXNwYWNlIEpBWFdTX05TID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgiamF4d3MiLCAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2pheHdzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHByaXZhdGUgc3RhdGljIE5hbWVzcGFjZSBTT0FQX05TID0gTmFtZXNwYWNlLmdldE5hbWVzcGFjZSgic29hcCIsICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvYmluZGluZ3Mvc29hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBET0NfUk9PVCA9ICJiZWFucyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3ByaW5nVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCZWFuc0ZpbGUoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgYmVhbnNGaWxlID0gbnVsbDsKLSAgICAgICAgSVBhdGggd2ViQ29udGVudFBhdGggPSBKMkVFVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0gICAgICAgIGlmICghd2ViQ29udGVudFBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgd2ViQ29udGVudFBhdGggPSB3ZWJDb250ZW50UGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCi0gICAgICAgICAgICBJUGF0aCB3ZWJJTkZQYXRoID0gd2ViQ29udGVudFBhdGguYXBwZW5kKG5ldyBQYXRoKCJXRUItSU5GLyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgSUZvbGRlciB3ZWJJTkZGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3ZWJJTkZQYXRoKTsKLSAgICAgICAgICAgIGJlYW5zRmlsZSA9IHdlYklORkZvbGRlci5nZXRGaWxlKCJiZWFucy54bWwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKCFiZWFuc0ZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJlYW5zRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pLCB0cnVlLCBwcm9ncmVzc01vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVCYXNlQmVhbnNGaWxlKGJlYW5zRmlsZSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZWFuc0ZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCZWFuc0ZpbGUoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY3hmLXNlcnZsZXQgZmlsZSBpbiB0aGUgV2ViIHByb2plY3RzIFdFQi1JTkYKLSAgICAgKiBmb2xkZXIuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHtAbGluayBJRmlsZX0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldENYRlNlcnZsZXQoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgY3hmU2VydmxldCA9IG51bGw7Ci0gICAgICAgIElQYXRoIHdlYkNvbnRlbnRQYXRoID0gSjJFRVV0aWxzLmdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotICAgICAgICBpZiAoIXdlYkNvbnRlbnRQYXRoLmhhc1RyYWlsaW5nU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgIHdlYkNvbnRlbnRQYXRoID0gd2ViQ29udGVudFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotICAgICAgICAgICAgSVBhdGggd2ViSU5GUGF0aCA9IHdlYkNvbnRlbnRQYXRoLmFwcGVuZChuZXcgUGF0aCgiV0VCLUlORi8iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIElGb2xkZXIgd2ViSU5GRm9sZGVyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGb2xkZXIod2ViSU5GUGF0aCk7Ci0gICAgICAgICAgICBjeGZTZXJ2bGV0ID0gd2ViSU5GRm9sZGVyLmdldEZpbGUoImN4Zi1zZXJ2bGV0LnhtbCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoIWN4ZlNlcnZsZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY3hmU2VydmxldC5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pLCB0cnVlLCBwcm9ncmVzc01vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICBjcmVhdGVCYXNlQ1hGU2VydmxldEZpbGUoY3hmU2VydmxldCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjeGZTZXJ2bGV0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0Q1hGU2VydmxldChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KEZpbGVVdGlscy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVCYXNlQ1hGU2VydmxldEZpbGUoSUZpbGUgY3hmU2VydmxldCkgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEVsZW1lbnQgYmVhbnMgPSBuZXcgRWxlbWVudChET0NfUk9PVCk7Ci0gICAgICAgIGJlYW5zLnNldE5hbWVzcGFjZShTUFJJTkdfQkVBTlNfTlMpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihYTUxOU19YU0kpOwotICAgICAgICBiZWFucy5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihKQVhXU19OUyk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFNPQVBfTlMpOwotCi0gICAgICAgIEF0dHJpYnV0ZSBzY2hlbWFMb2NhdGlvbiA9IG5ldyBBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgInNjaGVtYUxvY2F0aW9uIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLTIuNS54c2QgIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiaHR0cDovL2N4Zi5hcGFjaGUub3JnL2JpbmRpbmdzL3NvYXAgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvY29uZmlndXJhdGlvbi9zb2FwLnhzZCAiIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJodHRwOi8vY3hmLmFwYWNoZS5vcmcvamF4d3MgaHR0cDovL2N4Zi5hcGFjaGUub3JnL3NjaGVtYXMvamF4d3MueHNkIiwgWE1MTlNfWFNJKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGJlYW5zLnNldEF0dHJpYnV0ZShzY2hlbWFMb2NhdGlvbik7Ci0KLSAgICAgICAgd3JpdGVDb25maWcobmV3IERvY3VtZW50KGJlYW5zKSwgY3hmU2VydmxldCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVCYXNlQmVhbnNGaWxlKElGaWxlIGJlYW5zRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRWxlbWVudCBiZWFucyA9IG5ldyBFbGVtZW50KERPQ19ST09UKTsKLSAgICAgICAgYmVhbnMuc2V0TmFtZXNwYWNlKFNQUklOR19CRUFOU19OUyk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKFhNTE5TX1hTSSk7Ci0gICAgICAgIGJlYW5zLmFkZE5hbWVzcGFjZURlY2xhcmF0aW9uKEpBWFdTX05TKTsKLQotICAgICAgICBBdHRyaWJ1dGUgc2NoZW1hTG9jYXRpb24gPSBuZXcgQXR0cmlidXRlKAotICAgICAgICAgICAgICAgICJzY2hlbWFMb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0yLjUueHNkICIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgImh0dHA6Ly9jeGYuYXBhY2hlLm9yZy9qYXh3cyBodHRwOi8vY3hmLmFwYWNoZS5vcmcvc2NoZW1hcy9qYXh3cy54c2QiLCBYTUxOU19YU0kpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYmVhbnMuc2V0QXR0cmlidXRlKHNjaGVtYUxvY2F0aW9uKTsKLQotICAgICAgICBFbGVtZW50IGltcG9ydENYRlJlc291cmNlID0gbmV3IEVsZW1lbnQoImltcG9ydCIsIFNQUklOR19CRUFOU19OUyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW1wb3J0Q1hGUmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi54bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2UgPSBuZXcgRWxlbWVudCgiaW1wb3J0IiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgImNsYXNzcGF0aDpNRVRBLUlORi9jeGYvY3hmLWV4dGVuc2lvbi1zb2FwLnhtbCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgRWxlbWVudCBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2UgPSBuZXcgRWxlbWVudCgiaW1wb3J0IiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbXBvcnRDWEZTZXJ2ZWx0UmVzb3VyY2Uuc2V0QXR0cmlidXRlKCJyZXNvdXJjZSIsICJjbGFzc3BhdGg6TUVUQS1JTkYvY3hmL2N4Zi1zZXJ2bGV0LnhtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlJlc291cmNlKTsKLSAgICAgICAgYmVhbnMuYWRkQ29udGVudChpbXBvcnRDWEZTb2FwRXh0ZW5zaW9uUmVzb3VyY2UpOwotICAgICAgICBiZWFucy5hZGRDb250ZW50KGltcG9ydENYRlNlcnZlbHRSZXNvdXJjZSk7Ci0KLSAgICAgICAgd3JpdGVDb25maWcobmV3IERvY3VtZW50KGJlYW5zKSwgYmVhbnNGaWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTcHJpbmdCZWFuc0ZpbGUoSUZpbGUgc3ByaW5nQmVhbnNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQmVhbnNGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICBpZiAoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQmVhbnNJbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvb3QuZ2V0TmFtZSgpLmVxdWFscyhET0NfUk9PVCkgJiYgcm9vdC5nZXROYW1lc3BhY2UoKS5lcXVhbHMoU1BSSU5HX0JFQU5TX05TKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdCZWFuc0lucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCZWFuRGVmaW5lZChDWEZEYXRhTW9kZWwgY3hmRGF0YU1vZGVsLCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwKLSAgICAgICAgICAgIE5hbWVzcGFjZSBuYW1lc3BhY2UsIFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgc3ByaW5nQ29uZmlnRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgaWYgKENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldEJlYW5zRmlsZShwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0Q1hGU2VydmxldChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNTcHJpbmdCZWFuc0ZpbGUoc3ByaW5nQ29uZmlnRmlsZSkpIHsKLSAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3ByaW5nQ29uZmlnRmlsZS5nZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgIC50b0ZpbGUoKSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoc3ByaW5nQ29uZmlnSW5wdXRTdGVhbSk7Ci0gICAgICAgICAgICAgICAgRWxlbWVudCBiZWFucyA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgTGlzdDxFbGVtZW50PiBlbmRwb2ludHMgPSBiZWFucy5nZXRDaGlsZHJlbihlbGVtZW50TmFtZSwgbmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCA6IGVuZHBvaW50cykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGlkQXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEF0dHJpYnV0ZS5nZXRWYWx1ZSgpLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5kcG9pbnRBZGRyZXNzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBqYXh3c0VuZHBvaW50SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3ByaW5nQ29uZmlnRmlsZSA9IFNwcmluZ1V0aWxzLmdldENYRlNlcnZsZXQocHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzU3ByaW5nQmVhbnNGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpKSB7Ci0gICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNwcmluZ0NvbmZpZ0ZpbGUuZ2V0TG9jYXRpb24oKQotICAgICAgICAgICAgICAgICAgICAudG9GaWxlKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBidWlsZGVyLmJ1aWxkKHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbnMgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGVuZHBvaW50cyA9IGJlYW5zLmdldENoaWxkcmVuKCJlbmRwb2ludCIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZvciAoRWxlbWVudCBlbGVtZW50IDogZW5kcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXR0cmlidXRlLmdldFZhbHVlKCkuZXF1YWxzKGpheHdzRW5kcG9pbnRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImFkZHJlc3MiKS5nZXRWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBzcHJpbmdDb25maWdJbnB1dFN0ZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25Gcm9tV1NETChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBtb2RlbC5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gbW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KHRhcmdldE5hbWVzcGFjZSk7Ci0KLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RW5kcG9pbnROYW1lKHBvcnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBQb3J0VHlwZSBwb3J0VHlwZSA9IHBvcnQuZ2V0QmluZGluZygpLmdldFBvcnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSBwb3J0VHlwZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwb3J0VHlwZU5hbWUgPSBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSBwYWNrYWdlTmFtZSArICIuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBjb252ZXJ0UG9ydFR5cGVOYW1lKHBvcnRUeXBlTmFtZSkgKyAiSW1wbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIFNwcmluZ1V0aWxzLmNyZWF0ZUpBWFdTRW5kcG9pbnQobW9kZWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTcHJpbmdDb25maWdJbmZvcm1hdGlvbkZyb21XU0RMKENYRkRhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBJRmlsZSB3c2RsRmlsZSA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKG1vZGVsLmdldFByb2plY3ROYW1lKCkpLmdldEZpbGUobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICBpZiAod3NkbEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS5nZXRMb2NhdGlvblVSSSgpLnRvVVJMKCkpOwotICAgICAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlLmdldFFOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgICAgICAgICAgICAgICAgICBNYXAgcG9ydHNNYXAgPSBzZXJ2aWNlLmdldFBvcnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHBvcnRzU2V0ID0gcG9ydHNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IChQb3J0KSBwb3J0RW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldEVuZHBvaW50TmFtZShwb3J0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhtdXJsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRQb3J0VHlwZU5hbWUoU3RyaW5nIHBvcnRUeXBlTmFtZSkgewotICAgICAgICBTdHJpbmdbXSBzZWdtZW50cyA9IHBvcnRUeXBlTmFtZS5zcGxpdCgiW1xcLVxcLlxcOlxcX1xcdTAwYjdcXHUwMzg3XFx1MDZkZFxcdTA2ZGVdIik7Ci0KLSAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc2VnbWVudCA6IHNlZ21lbnRzKSB7Ci0gICAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyIGZpcnN0Q2hhcmFjdGVyID0gc2VnbWVudC5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0RpZ2l0KGZpcnN0Q2hhcmFjdGVyKSAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoZmlyc3RDaGFyYWN0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBzZWdtZW50LnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjaGFyIGN1cnJlbnRDaGFyID0gc2VnbWVudC5jaGFyQXQoaSk7Ci0gICAgICAgICAgICAgICAgY2hhciBwcmVjZWRpbmdDaGFyID0gc2VnbWVudC5jaGFyQXQoaSAtIDEpOwotICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoY3VycmVudENoYXIpICYmIENoYXJhY3Rlci5pc0RpZ2l0KHByZWNlZGluZ0NoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY3VycmVudENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgPSBzZWdtZW50LnN1YnN0cmluZygwLCBpKSArIHNlZ21lbnQuc3Vic3RyaW5nKGksIGkgKyAxKS50b1VwcGVyQ2FzZSgpCi0gICAgICAgICAgICAgICAgICAgICsgc2VnbWVudC5zdWJzdHJpbmcoaSArIDEsIHNlZ21lbnQubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHNlZ21lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUpBWFdTRW5kcG9pbnQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotCi0gICAgICAgIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUgPSBudWxsOwotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKSB7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlID0gU3ByaW5nVXRpbHMuZ2V0QmVhbnNGaWxlKHByb2plY3ROYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0ZpbGUgPSBTcHJpbmdVdGlscy5nZXRDWEZTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1NwcmluZ0JlYW5zRmlsZShzcHJpbmdDb25maWdGaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzcHJpbmdDb25maWdJbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChzcHJpbmdDb25maWdJbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGJlYW5zID0gZG9jLmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGpheHdzRW5kcG9pbnQgPSBuZXcgRWxlbWVudCgiZW5kcG9pbnQiLCBKQVhXU19OUyk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldEpBWFdTRW5kcG9pbnRJRChtb2RlbCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Q29uZmlnSWQoaWQpOwotICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImltcGxlbWVudG9yIiwgbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgid3NkbExvY2F0aW9uIiwgbW9kZWwuZ2V0Q29uZmlnV3NkbExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwgJiYgbW9kZWwuZ2V0U2VydmljZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LnNldEF0dHJpYnV0ZSgiZW5kcG9pbnROYW1lIiwgInRuczoiICsgbW9kZWwuZ2V0RW5kcG9pbnROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJzZXJ2aWNlTmFtZSIsICJ0bnM6IiArIG1vZGVsLmdldFNlcnZpY2VOYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlIFhNTE5TX1ROUyA9IE5hbWVzcGFjZS5nZXROYW1lc3BhY2UoInRucyIsIG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5hZGROYW1lc3BhY2VEZWNsYXJhdGlvbihYTUxOU19UTlMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEVuZHBvaW50TmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgamF4d3NFbmRwb2ludC5zZXRBdHRyaWJ1dGUoImFkZHJlc3MiLCAiLyIgKyBtb2RlbC5nZXRFbmRwb2ludE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGpheHdzRW5kcG9pbnQuc2V0QXR0cmlidXRlKCJhZGRyZXNzIiwgIi8iICsgaWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgamF4d3NGZWF0dXJlcyA9IG5ldyBFbGVtZW50KCJmZWF0dXJlcyIsIEpBWFdTX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIEVsZW1lbnQgYmVhbiA9IG5ldyBFbGVtZW50KCJiZWFuIiwgU1BSSU5HX0JFQU5TX05TKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGJlYW4uc2V0QXR0cmlidXRlKCJjbGFzcyIsICJvcmcuYXBhY2hlLmN4Zi5mZWF0dXJlLkxvZ2dpbmdGZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgIGpheHdzRmVhdHVyZXMuYWRkQ29udGVudChiZWFuKTsKLSAgICAgICAgICAgICAgICBqYXh3c0VuZHBvaW50LmFkZENvbnRlbnQoamF4d3NGZWF0dXJlcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWlzQmVhbkRlZmluZWQobW9kZWwsIHByb2plY3ROYW1lLCAiZW5kcG9pbnQiLCBKQVhXU19OUywgaWQpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgYmVhbnMuYWRkQ29udGVudChqYXh3c0VuZHBvaW50KTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZUNvbmZpZyhkb2MsIHNwcmluZ0NvbmZpZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHNwcmluZ0NvbmZpZ0lucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKQVhXU0VuZHBvaW50SUQoQ1hGRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFN0cmluZyBpbXBsZW1lbnRvciA9IG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpOwotICAgICAgICBpZiAoaW1wbGVtZW50b3IuaW5kZXhPZigiLiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGltcGxlbWVudG9yID0gaW1wbGVtZW50b3Iuc3Vic3RyaW5nKGltcGxlbWVudG9yLmxhc3RJbmRleE9mKCIuIikgKyAxLCBpbXBsZW1lbnRvci5sZW5ndGgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRvci5zdGFydHNXaXRoKCJJbXBsIikgJiYgaW1wbGVtZW50b3IuaW5kZXhPZigiSW1wbCIpICE9IC0xKSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnN1YnN0cmluZygwLCBpbXBsZW1lbnRvci5pbmRleE9mKCJJbXBsIikpLnRvTG93ZXJDYXNlKCk7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbXBsZW1lbnRvciA9IGltcGxlbWVudG9yLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGltcGxlbWVudG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDb25maWcoRG9jdW1lbnQgZG9jdW1lbnQsIElGaWxlIHNwcmluZ0NvbmZpZ0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzcHJpbmdDb25maWdGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZG9jdW1lbnQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdGaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5mb3JtYXRYTUxGaWxlKHNwcmluZ0NvbmZpZ0ZpbGUpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbEFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2ZhY2V0L0NYRkZhY2V0SW5zdGFsbEFjdGlvbkNvbmZpZ0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkNmVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBDWEZGYWNldEluc3RhbGxBY3Rpb25Db25maWdGYWN0b3J5IGltcGxlbWVudHMgSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgewotCi0gICAgcHVibGljIE9iamVjdCBjcmVhdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIENYRkRhdGFNb2RlbCBkYXRhTW9kZWwgPSBDWEZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhMldTRGF0YU1vZGVsKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lVmVyc2lvbihjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldERlZmF1bHRSdW50aW1lTG9jYXRpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkpOwotICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpOwotICAgICAgICBkYXRhTW9kZWwuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSk7Ci0gICAgICAgIHJldHVybiBkYXRhTW9kZWw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNDhjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQWNjZXNzUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEFkZHMgdGhlIENYRiBjbGFzc3BhdGggY29udGFpbmVyIHRvIHRoZSBwcm9qZWN0LgotICogPHA+Ci0gKiBBbHNvIHNldHMgdXAgdGhlIHdlYiBwcm9qZWN0cyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwgZmlsZSkKLSAqIHRvIHVzZSBjeGYtc2VydmxldCBvciB0aGUgU3ByaW5nIEFwcGxpY2F0aW9uIGNvbnRleHQgKFdFQi1JTkYvYmVhbnMueG1sKSBmb3IKLSAqIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24uIERlcGVuZHMgb24gYSBzZXR0aW5nIGluIHRoZSBDWEYgcHJlZmVyZW5jZXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsCi0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotICAgICAgICBDWEZEYXRhTW9kZWwgbW9kZWwgPSAoQ1hGRGF0YU1vZGVsKSBjb25maWc7Ci0KLSAgICAgICAgLy9TZXQgcHJvamVjdCBkZWZhdWx0Ci0gICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QsIG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKTsKLQotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIENYRkNvcmVNZXNzYWdlcy5DWEZfRkFDRVRfSU5TVEFMTF9ERUxFR0FURV9SVU5USU1FX0xPQ0FUSU9OX05PVF9TRVQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIElQYXRoIGN4ZkxpYlBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkpOwotCi0gICAgICAgIGlmICghY3hmTGliUGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICBjeGZMaWJQYXRoID0gY3hmTGliUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGN4ZkxpYlBhdGggPSBjeGZMaWJQYXRoLmFwcGVuZCgibGliIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlIGpzdENvbXBvbmVudERlcGVuZGVuY3kgPQotICAgICAgICAgICAgSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiLCAiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGN4ZkNsYXNzcGF0aENvbnRhaW5lciA9Ci0gICAgICAgICAgICBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXcgUGF0aChDWEZDb3JlUGx1Z2luLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IElBY2Nlc3NSdWxlWzBdLAotICAgICAgICAgICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmlzRXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyKCkKLSAgICAgICAgICAgICAgICAgICAgPyBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde2pzdENvbXBvbmVudERlcGVuZGVuY3l9IDogbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXt9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotCi0gICAgICAgIEpEVFV0aWxzLmFkZFRvQ2xhc3NwYXRoKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgY3hmQ2xhc3NwYXRoQ29udGFpbmVyKTsKLQotICAgICAgICAvLyBBZGQgQ1hGIFNlcnZsZXQsIFNlcnZsZXQgTWFwcGluZyBhbmQgU2Vzc2lvbiBDb25maWcgdG8gd2ViLnhtbAotICAgICAgICBmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgIHByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlU3ByaW5nQXBwQ29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCkuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKTsKLSAgICAgICAgICAgICAgICAvLyBqc3Qud2ViIDIuNQotICAgICAgICAgICAgICAgIGlmIChtb2RlbFByb3ZpZGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCBqYXZhZWVXZWJBcHAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxQcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ1hGSlNUV0VCMjVTZXJ2bGV0KHByb2plY3QsIGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VTcHJpbmdBcHBDb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRXZWIyNShwcm9qZWN0LCBqYXZhZWVXZWJBcHApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCBudWxsKTsKLQotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dFdlYjI1KElQcm9qZWN0IHdlYlByb2plY3QsCi0gICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViYXBwKSB7Ci0gICAgICAgIExpc3QgY29udGV4dFBhcmFtcyA9IHdlYmFwcC5nZXRDb250ZXh0UGFyYW1zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dFBhcmFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUGFyYW1WYWx1ZSBjb250ZXh0UGFyYW0gPSAoUGFyYW1WYWx1ZSkgY29udGV4dFBhcmFtcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dFBhcmFtLmdldFBhcmFtTmFtZSgpLmVxdWFscygiY29udGV4dENvbmZpZ0xvY2F0aW9uIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3QgbGlzdGVuZXJzID0gd2ViYXBwLmdldExpc3RlbmVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIGNvbnRleHRMb2FkZXJMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcikgbGlzdGVuZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChjb250ZXh0TG9hZGVyTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzcygpLmVxdWFscygKLSAgICAgICAgICAgICJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBKYXZhZWVGYWN0b3J5IGphdmFlZUZhY3RvcnkgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRTsKLQotICAgICAgICBQYXJhbVZhbHVlIGNvbmZpZ0xvY2F0aW9uUGFyYW0gPSBqYXZhZWVGYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWUoKTsKLSAgICAgICAgY29uZmlnTG9jYXRpb25QYXJhbS5zZXRQYXJhbU5hbWUoImNvbnRleHRDb25maWdMb2NhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNvbmZpZ0xvY2F0aW9uUGFyYW0uc2V0UGFyYW1WYWx1ZSgiV0VCLUlORi9iZWFucy54bWwiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHdlYmFwcC5nZXRDb250ZXh0UGFyYW1zKCkuYWRkKGNvbmZpZ0xvY2F0aW9uUGFyYW0pOwotCi0gICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciBjb250ZXh0TG9hZGVyTGlzdGVuZXIgPSBqYXZhZWVGYWN0b3J5LmNyZWF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgIGNvbnRleHRMb2FkZXJMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKCJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgd2ViYXBwLmdldExpc3RlbmVycygpLmFkZChjb250ZXh0TG9hZGVyTGlzdGVuZXIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCBhZGRDWEZKU1RXRUIyNVNlcnZsZXQoSVByb2plY3Qgd2ViUHJvamVjdCwgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYmFwcCkgewotICAgICAgICBMaXN0IHNlcnZsZXRzID0gd2ViYXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmxldHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlcnZsZXQgc2VydmxldCA9IChTZXJ2bGV0KSBzZXJ2bGV0cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscygiY3hmIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENYRiBTZXJ2bGV0Ci0gICAgICAgIFdlYkZhY3RvcnkgZmFjdG9yeSA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFOwotICAgICAgICBTZXJ2bGV0IGN4ZlNlcnZsZXQgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLQotICAgICAgICBjeGZTZXJ2bGV0LnNldFNlcnZsZXROYW1lKCJjeGYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIERpc3BsYXlOYW1lIGN4ZlNlcnZsZXREaXNwbGF5TmFtZSA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGN4ZlNlcnZsZXREaXNwbGF5TmFtZS5zZXRWYWx1ZSgiY3hmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldC5nZXREaXNwbGF5TmFtZXMoKS5hZGQoY3hmU2VydmxldERpc3BsYXlOYW1lKTsKLQotICAgICAgICBEZXNjcmlwdGlvbiBjeGZTZXJ2bGV0RGVzY3JpcHRpb24gPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgICBjeGZTZXJ2bGV0RGVzY3JpcHRpb24uc2V0VmFsdWUoIkFwYWNoZSBDWEYgRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjeGZTZXJ2bGV0LmdldERlc2NyaXB0aW9ucygpLmFkZChjeGZTZXJ2bGV0RGVzY3JpcHRpb24pOwotCi0gICAgICAgIGN4ZlNlcnZsZXQuc2V0U2VydmxldENsYXNzKCJvcmcuYXBhY2hlLmN4Zi50cmFuc3BvcnQuc2VydmxldC5DWEZTZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBjeGZTZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQotICAgICAgICB3ZWJhcHAuZ2V0U2VydmxldHMoKS5hZGQoY3hmU2VydmxldCk7Ci0KLSAgICAgICAgU2VydmxldE1hcHBpbmcgY3hmU2VydmxldE1hcHBpbmcgPSBmYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0gICAgICAgIGN4ZlNlcnZsZXRNYXBwaW5nLnNldFNlcnZsZXROYW1lKCJjeGYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBVcmxQYXR0ZXJuVHlwZSB1cmwgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVcmxQYXR0ZXJuVHlwZSgpOwotICAgICAgICB1cmwuc2V0VmFsdWUoIi9zZXJ2aWNlcy8qIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY3hmU2VydmxldE1hcHBpbmcuZ2V0VXJsUGF0dGVybnMoKS5hZGQodXJsKTsKLSAgICAgICAgd2ViYXBwLmdldFNlcnZsZXRNYXBwaW5ncygpLmFkZChjeGZTZXJ2bGV0TWFwcGluZyk7Ci0KLSAgICAgICAgU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnID0gZmFjdG9yeS5jcmVhdGVTZXNzaW9uQ29uZmlnKCk7Ci0gICAgICAgIHNlc3Npb25Db25maWcuc2V0U2Vzc2lvblRpbWVvdXQobmV3IEJpZ0ludGVnZXIoIjYwIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHdlYmFwcC5nZXRTZXNzaW9uQ29uZmlncygpLmFkZChzZXNzaW9uQ29uZmlnKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9mYWNldC9DWEZGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDQwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvZmFjZXQvQ1hGRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENYRkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotICAgICAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAKLSAgICAgICAgLy9UT0RPIEltcGxlbWVudAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjFkMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNGU4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NCBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTIyZTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249IlsxLjYuMiwxLjcuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjEwMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDIuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNSwxLjEuMCkiCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLUNyZWF0ZWQtQnk6IDEuNS4wXzE0LWIwMyAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxNjliZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhNzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkOGM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgQ3JlYXRpb24gQ29yZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGM5NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1ZBTElEX1BPUlRUWVBFX01FU1NBR0U7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRVJWSUNFX0lNUExfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWMxMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9DWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczogCi0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1I9QSBwb3NzaWJsZSBjb25mbGljdCBoYXMgYmVlbiBkZXRlY3RlZCBiZXR3ZWVuIHByb2plY3Qgc2VsZWN0aW9ucy5cblxuIFRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gY29kZSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgInswfSIgcHJvamVjdC5cblxuVG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIGNsaWNrIENhbmNlbCBhbmQgdGhlbiBzZWxlY3QgdGhlICJTZXJ2aWNlIHByb2plY3Q6IiBsaW5rIGluIHRoZSAiQ29uZmlndXJhdGlvbjoiIHNlY3Rpb24gaW4gdGhlIFdlYiBTZXJ2aWNlIHdpemFyZC5cblxuQ2xpY2sgT2sgdG8gY29udGludWUgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1XU0RMMkpBVkFfVkFMSURfUE9SVFRZUEVfTUVTU0FHRT1UaGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB2YWxpZCBwb3J0VHlwZSBlbGVtZW50Ci0KLUpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORD1UaGUgU2VydmljZSBJbXBsZW1lbnRhdGlvbiAiezB9IiBjYW5ub3QgYmUgbG9hZGVkIGZyb20gdGhlICJ7MX0iIHByb2plY3QuIFBsZWFzZSBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IGNvbnRhaW5zIHRoZSBjbGFzcyBhbmQgdGhhdCBpdCBpcyB2aXNpYmxlIG9uIHRoZSBwcm9qZWN0cyAiSmF2YSBCdWlsZCBQYXRoIi4KLUpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9CSU5BUlk9QmluYXJ5IGNsYXNzIGZpbGVzIG5vdCBzdXBwb3J0ZWQuIFRoZSBTZXJ2aWNlIEltcGxlbWVudGF0aW9uIG11c3QgYmUgYSBKYXZhIFNvdXJjZSB0eXBlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL0NYRkNyZWF0aW9uQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM5ZTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gcGx1Z2luOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIENYRkNyZWF0aW9uQ29yZVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDcmVhdGlvbkNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0gICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvQ1hGRGVwbG95Q29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNjQ1ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9DWEZEZXBsb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBCdWcgIzI3NDI5MyAtIHN1ZGhhbkBwcm9ncmVzcy5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5FeHRlbnNpYmlsaXR5RWxlbWVudDsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkFkZHJlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb21tb24uU2VydmVyVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkRhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LldlYlNlcnZpY2VJbmZvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRkRlcGxveUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENYRl9TRVJWTEVUID0gIm9yZy5hcGFjaGUuY3hmLnRyYW5zcG9ydC5zZXJ2bGV0LkNYRlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd2ViU2VydmljZTsKLSAgICBwcml2YXRlIENYRkRhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBDWEZEZXBsb3lDb21tYW5kKFN0cmluZyBwcm9qZWN0TmFtZSwgSVdlYlNlcnZpY2Ugd2ViU2VydmljZSkgewotICAgICAgICB0aGlzLnByb2plY3QgPSBGaWxlVXRpbHMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHRoaXMud2ViU2VydmljZSA9IHdlYlNlcnZpY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgV2ViU2VydmljZUluZm8gd2ViU2VydmljZUluZm8gPSB3ZWJTZXJ2aWNlLmdldFdlYlNlcnZpY2VJbmZvKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBzZXJ2ZXJJbnN0YW5jZUlkID0gd2ViU2VydmljZUluZm8uZ2V0U2VydmVySW5zdGFuY2VJZCgpOwotICAgICAgICAgICAgU3RyaW5nIHNlcnZlckZhY3RvcnlJZCA9IHdlYlNlcnZpY2VJbmZvLmdldFNlcnZlckZhY3RvcnlJZCgpOwotICAgICAgICAgICAgaWYgKHNlcnZlckluc3RhbmNlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gU2VydmVyQ29yZS5maW5kU2VydmVyKHNlcnZlckluc3RhbmNlSWQpOwotICAgICAgICAgICAgICAgIFN0cmluZyB3ZWJDb2JDb21wb25lbnRVUkwgPSBTZXJ2ZXJVdGlscy5nZXRFbmNvZGVkV2ViQ29tcG9uZW50VVJMKHByb2plY3QsIHNlcnZlckZhY3RvcnlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcik7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgdXJsUGF0dGVybiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgICAgICBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1vZGVsUHJvdmlkZXIgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgIC8vIGpzdC53ZWIgMi41Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVsUHJvdmlkZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIGphdmFlZVdlYkFwcCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtb2RlbFByb3ZpZGVyOwotCi0gICAgICAgICAgICAgICAgICAgIHVybFBhdHRlcm4gPSBnZXRVUkxQYXR0ZXJuKGphdmFlZVdlYkFwcCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8ganN0LndlYiAyLjQKLSAgICAgICAgICAgICAgICBpZiAobW9kZWxQcm92aWRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgewotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIG1vZGVsUHJvdmlkZXI7Ci0KLSAgICAgICAgICAgICAgICAgICAgdXJsUGF0dGVybiA9IGdldFVSTFBhdHRlcm4od2ViQXBwKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cmxQYXR0ZXJuID0gdXJsUGF0dGVybi5zdWJzdHJpbmcoMCwgdXJsUGF0dGVybi5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIFN0cmluZyBqYXh3c0VuZHBvaW50QWRkcmVzcyA9IFNwcmluZ1V0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0Q29uZmlnSWQoKSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgd3NkbEFkZHJlc3MgPSB3ZWJDb2JDb21wb25lbnRVUkwgKyB1cmxQYXR0ZXJuICsgamF4d3NFbmRwb2ludEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHdzZGxVUkwgPSB3c2RsQWRkcmVzcyArICI/d3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgICAgIHdlYlNlcnZpY2UuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRXc2RsVVJMKHdzZGxVUkwpOwotCi0gICAgICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLQotICAgICAgICAgICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETFV0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgKChTT0FQQWRkcmVzcykgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpLnNldExvY2F0aW9uVVJJKHdzZGxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFNPQVAxMkFkZHJlc3MpIGV4dGVuc2liaWxpdHlFbGVtZW50KS5zZXRMb2NhdGlvblVSSSh3c2RsQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBXU0RMVXRpbHMud3JpdGVXU0RMKG1vZGVsLmdldFdzZGxVUkwoKSwgZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VVJMUGF0dGVybihvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgamF2YWVlV2ViQXBwKSB7Ci0gICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldD4gc2VydmxldHMgPSBqYXZhZWVXZWJBcHAuZ2V0U2VydmxldHMoKTsKLSAgICAgICAgZm9yIChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgaWYgKHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZXF1YWxzKENYRl9TRVJWTEVUKSkgewotICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc+IHNlcnZsZXRNYXBwaW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgIGphdmFlZVdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nIDogc2VydmxldE1hcHBpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0TWFwcGluZy5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZT4gdXJsUGF0dGVybnMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRNYXBwaW5nLmdldFVybFBhdHRlcm5zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsUGF0dGVybnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICh1cmxQYXR0ZXJucy5nZXQoMCkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU3RyaW5nIGdldFVSTFBhdHRlcm4ob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBMaXN0PG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ+IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCBzZXJ2bGV0IDogc2VydmxldHMpIHsKLSAgICAgICAgICAgIGlmIChzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpLmdldEphdmFOYW1lKCkuZXF1YWxzKENYRl9TRVJWTEVUKSkgewotICAgICAgICAgICAgICAgIExpc3Q8b3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc+IHNlcnZsZXRNYXBwaW5ncyA9Ci0gICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLSAgICAgICAgICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nIDogc2VydmxldE1hcHBpbmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0TWFwcGluZy5nZXRTZXJ2bGV0KCkuZ2V0U2VydmxldE5hbWUoKS5lcXVhbHMoc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZsZXRNYXBwaW5nLmdldFVybFBhdHRlcm4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDWEZEYXRhTW9kZWwoQ1hGRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudENvbXBvbmVudFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAidGVtcGxhdGUuY3hmLmNvcmUiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTE4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuQW50RW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIGludCBudW1iZXJPZkNoYW5nZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgamF2YUNsYXNzVHlwZTsKLSAgICBwcml2YXRlIElUeXBlIGphdmFJbnRlcmZhY2VUeXBlOwotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGVKYXZhQ29tbWFuZChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBpZiAoZ2V0RW52aXJvbm1lbnQoKSBpbnN0YW5jZW9mIEFudEVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIGFubm90YXRlSW50ZXJmYWNlKG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGVTRUlDbGFzcyhtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0ZUNsYXNzKG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaXRlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVJbnRlcmZhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLSAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGphdmFJbnRlcmZhY2VUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgSW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUludGVyZmFjZVR5cGUuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJTZXJ2aWNlQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICBJTWV0aG9kW10gdHlwZU1ldGhvZHMgPSBKRFRVdGlscy5nZXRQdWJsaWNNZXRob2RzKGphdmFJbnRlcmZhY2VUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwgfHwgbWV0aG9kQW5ub3RhdGlvbk1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlc3BvbnNlV3JhcHBlckFubm90YXRpb25DaGFuZ2UoamF2YUludGVyZmFjZVR5cGUsIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLldFQl9QQVJBTSkpIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlBhcmFtQW5ub3RhdGlvbkNoYW5nZShqYXZhSW50ZXJmYWNlVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhSW50ZXJmYWNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbW9kZWwsCi0gICAgICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UsIGZhbHNlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5ub3RhdGVDbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgamF2YUNsYXNzVHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKSk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpbmcgQ2xhc3MiLAotICAgICAgICAgICAgICAgIChJRmlsZSkgamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyhqYXZhQ2xhc3NUeXBlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSB0eXBlTWV0aG9kc1tpXTsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwID09IG51bGwgfHwgbWV0aG9kQW5ub3RhdGlvbk1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViTWV0aG9kQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSKSkgewotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZShqYXZhQ2xhc3NUeXBlLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRXZWJQYXJhbUFubm90YXRpb25DaGFuZ2UoamF2YUNsYXNzVHlwZSwgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTG9jYWxWYXJpYWJsZSkgcGFyYW1ldGVyLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgdGV4dEZpbGVDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShqYXZhQ2xhc3NUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtb2RlbCwKLSAgICAgICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotCi0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobW9uaXRvciwgdGV4dEZpbGVDaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0ZVNFSUNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICBqYXZhQ2xhc3NUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQotICAgICAgICBUZXh0RmlsZUNoYW5nZSB0ZXh0RmlsZUNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQW5ub3RhdGlvbiBDaGFuZ2VzIiwKLSAgICAgICAgICAgICAgICAoSUZpbGUpamF2YUNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQotICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYlNlcnZpY2VBbm5vdGF0aW9uQ2hhbmdlKGphdmFDbGFzc1R5cGUsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSk7Ci0KLSAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRJbXBvcnRzQ2hhbmdlKGphdmFDbGFzc1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG1vZGVsLAotICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICBleGVjdXRlQ2hhbmdlKG1vbml0b3IsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNoYW5nZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsIHx8ICFjaGFuZ2UuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyID0gUmVmYWN0b3JpbmdDb3JlLmdldFVuZG9NYW5hZ2VyKCk7Ci0gICAgICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bCA9IGZhbHNlOwotICAgICAgICBDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2UuaW5pdGlhbGl6ZVZhbGlkYXRpb25EYXRhKG1vbml0b3IpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmdTdGF0dXMgdmFsaWQgPSBjaGFuZ2UuaXNWYWxpZChtb25pdG9yKTsKLSAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKLSAgICAgICAgICAgICAgICBtYW5hZ2VyLmFib3V0VG9QZXJmb3JtQ2hhbmdlKGNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IGNoYW5nZS5wZXJmb3JtKG1vbml0b3IpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwotICAgICAgICAgICAgICAgIG51bWJlck9mQ2hhbmdlcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICBJVW5kb01hbmFnZXIgbWFuYWdlciA9IFJlZmFjdG9yaW5nQ29yZS5nZXRVbmRvTWFuYWdlcigpOwotCi0gICAgICAgIGlmIChtYW5hZ2VyLmFueXRoaW5nVG9VbmRvKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkNoYW5nZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnBlcmZvcm1VbmRvKG51bGwsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjM4YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnJlc291cmNlcy5KYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLldlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ29tbWFuZExpbmVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5MYXVuY2hVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuU3ByaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgdGhlIDxjb2RlPm9yZy5hcGFjaGUuY3hmLnRvb2xzLmphdmEyd3MuSmF2YVRvV1M8L2NvZGU+IG9yIHRoZQotICogPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3c2RsLkphdmFUb1dTREw8L2NvZGU+IGNvbW1hbmQgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uCi0gKiBvZiBDWEYgdXNlZC4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhMldTQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy5qYXZhMndzZGwuSmF2YVRvV1NETCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19UT09MX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS5jeGYudG9vbHMuamF2YTJ3cy5KYXZhVG9XUyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIFN0cmluZyBDWEZfVE9PTF9DTEFTU19OQU1FOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCi0gICAgcHJpdmF0ZSBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0NvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0UHJvamVjdE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50ID0gSkRUVXRpbHMuZmluZFR5cGUocHJvamVjdE5hbWUsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICBqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBKYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKRFRVdGlscwotICAgICAgICAgICAgICAgIC5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgoc3RhcnRpbmdQb2ludCkpOwotICAgICAgICB3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyKHByb2plY3ROYW1lKTsKLQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NfVE9PTF9DTEFTU19OQU1FOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9IEpBVkEyV1NETF9UT09MX0NMQVNTX05BTUU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0SmF2YTJXU1Byb2dyYW1Bcmd1bWVudHMobW9kZWwpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gRmlsZVV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgTGF1bmNoVXRpbHMubGF1bmNoKGphdmFQcm9qZWN0LCBDWEZfVE9PTF9DTEFTU19OQU1FLCBwcm9nQXJncyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUoyV0ZpbGVzRnJvbVRtcChtb2RlbCk7Ci0KLSAgICAgICAgICAgIGlmIChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMubG9hZFNwcmluZ0NvbmZpZ0luZm9ybWF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgfHwgaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU3ByaW5nVXRpbHMuY3JlYXRlSkFYV1NFbmRwb2ludChtb2RlbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvbkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVmcmVzaFByb2plY3QocHJvamVjdE5hbWUsIG1vbml0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvblNlbGVjdGVkKCkgewotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgIT0gbnVsbCAmJgotICAgICAgICBtb2RlbC5nZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0dlbmVyYXRlU2VydmVyKCkgewotICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKSB7Ci0gICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUobW9kZWwuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSgpICsgIkltcGwiKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICBMaXN0PElSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbChqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBjaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgaWYgKGNoYW5nZWRSZXNvdXJjZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZUNsaWVudChjb250ZXh0LmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlWFNESW1wb3J0cyhjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0Q1hGRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgLy9BTlQgRW52aXJvbm1lbnQgTWFwcGluZ3MKLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZUNsaWVudChCb29sZWFuIGdlbmVyYXRlQ2xpZW50KSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbmVyYXRlQ2xpZW50KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVNlcnZlcihCb29sZWFuIGdlbmVyYXRlU2VydmVyKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKEJvb2xlYW4gZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucykgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlV1NETChCb29sZWFuIGdlbmVyYXRlV1NETCkgewotICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdTREwoZ2VuZXJhdGVXU0RMKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXc2RsRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUod3NkbEZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmF0ZVhTREltcG9ydHMoQm9vbGVhbiBnZW5lcmF0ZVhTREltcG9ydHMpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGdlbmVyYXRlWFNESW1wb3J0cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlU09BUDEyQmluZGluZyhCb29sZWFuIHVzZVNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgbW9kZWwuc2V0U29hcDEyQmluZGluZyh1c2VTT0FQMTJCaW5kaW5nKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZGU5YmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuSmF2YTJXU1BlcnNpc3RlbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0KLSAgICBwdWJsaWMgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0KLSAgICAgICAgICAgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlID0gZ2V0SmF2YVN0YXJ0aW5nUG9pbnRUeXBlKCk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRFeHRyYWN0SW50ZXJmYWNlKGZhbHNlKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gc3RhcnRpbmdQb2ludFR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFRhcmdldE5hbWVzcGFjZShKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKGNvbnRleHQuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdlYk1ldGhvZEFubm90YXRpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbihjb250ZXh0LmlzR2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0QW5ub3RhdGlvbk1hcChDWEZNb2RlbFV0aWxzLmdldEFubm90YXRpb25NYXAobW9kZWwpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChzdGFydGluZ1BvaW50VHlwZSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVYU0RJbXBvcnRzKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXREYXRhYmluZGluZyhjb250ZXh0LmdldERhdGFiaW5kaW5nKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0RnJvbnRlbmQoY29udGV4dC5nZXRGcm9udGVuZCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGNvbnRleHQuaXNHZW5lcmF0ZUNsaWVudCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFNvYXAxMkJpbmRpbmcoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVXU0RMKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIG1vZGVsLnNldFZlcmJvc2UoY29udGV4dC5pc1ZlcmJvc2UoKSk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzc05hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUoY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgKyBXU0RMVXRpbHMuV1NETF9GSUxFX0VYVEVOU0lPTik7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGptZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBDWEZEYXRhTW9kZWwgZ2V0SmF2YTJXU0RhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJVHlwZSBnZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoKSB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0gICAgICAgIFN0cmluZyBqYXZhU3RhcnRpbmdQb2ludCA9IG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCk7Ci0KLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJVHlwZSBzdGFydGluZ1BvaW50VHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKGphdmFQcm9qZWN0LCBqYXZhU3RhcnRpbmdQb2ludCk7Ci0gICAgICAgIHJldHVybiBzdGFydGluZ1BvaW50VHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkKLSAgICAgICAgLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwM2Y4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL0phdmEyV1NTZWxlY3RTRUlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LnJlZmFjdG9yaW5nLnN0cnVjdHVyZS5FeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLldvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSmF2YVByZWZlcmVuY2VzU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuQnVzeUluZGljYXRvclJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGVja0NvbmRpdGlvbnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Qcm9jZXNzb3JCYXNlZFJlZmFjdG9yaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuQW50RW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKYXZhMldTU2VsZWN0U0VJQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIENoYW5nZSB1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHVibGljIEphdmEyV1NTZWxlY3RTRUlDb21tYW5kKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGphdmFTdGFydGluZ1BvaW50ID0gbW9kZWwuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKTsKLQotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgc3RhcnRpbmdQb2ludFR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShqYXZhUHJvamVjdCwgamF2YVN0YXJ0aW5nUG9pbnQpOwotCi0gICAgICAgICAgICBpZiAoc3RhcnRpbmdQb2ludFR5cGUuaXNJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc3RhcnRpbmdQb2ludFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1VzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpICYmIG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2Uoc3RhcnRpbmdQb2ludFR5cGUsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgc3RhdHVzID0gam1lLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdEludGVyZmFjZShJVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLSAgICAgICAgaWYgKGdldEVudmlyb25tZW50KCkgaW5zdGFuY2VvZiBBbnRFbnZpcm9ubWVudCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBFeHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3IgPSBuZXcgRXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvcih0eXBlLAotICAgICAgICAgICAgICAgICAgICBKYXZhUHJlZmVyZW5jZXNTZXR0aW5ncy5nZXRDb2RlR2VuZXJhdGlvblNldHRpbmdzKHR5cGUuZ2V0SmF2YVByb2plY3QoKSkpOwotICAgICAgICAgICAgUmVmYWN0b3JpbmcgZXh0cmFjdEludGVyZmFjZVJlZmFjdG9yaW5nID0gbmV3IFByb2Nlc3NvckJhc2VkUmVmYWN0b3JpbmcoZXh0cmFjdEludGVyZmFjZVByb2Nlc3NvcikgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIFJlZmFjdG9yaW5nUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IG1vZGVsLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoKTsKLSAgICAgICAgICAgIGlmICh0eXBlTmFtZS5pbmRleE9mKCIuIikgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZyh0eXBlTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSwgdHlwZU5hbWUubGVuZ3RoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRUeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldFJlcGxhY2UoZmFsc2UpOwotCi0gICAgICAgICAgICBTZXQ8SU1ldGhvZD4gbWV0aG9kcyA9IG1vZGVsLmdldE1ldGhvZE1hcCgpLmtleVNldCgpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRFeHRyYWN0ZWRNZW1iZXJzKG1ldGhvZHMudG9BcnJheShuZXcgSU1lbWJlclttZXRob2RzLnNpemUoKV0pKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0QWJzdHJhY3QoZmFsc2UpOwotICAgICAgICAgICAgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5zZXRQdWJsaWModHJ1ZSk7Ci0gICAgICAgICAgICBleHRyYWN0SW50ZXJmYWNlUHJvY2Vzc29yLnNldENvbW1lbnRzKGZhbHNlKTsKLSAgICAgICAgICAgIGV4dHJhY3RJbnRlcmZhY2VQcm9jZXNzb3Iuc2V0SW5zdGFuY2VPZihmYWxzZSk7Ci0KLSAgICAgICAgICAgIENyZWF0ZUNoYW5nZU9wZXJhdGlvbiBjcmVhdGVDaGFuZ2VPcGVyYXRpb24gPSBuZXcgQ3JlYXRlQ2hhbmdlT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICBuZXcgQ2hlY2tDb25kaXRpb25zT3BlcmF0aW9uKGV4dHJhY3RJbnRlcmZhY2VSZWZhY3RvcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0NvbmRpdGlvbnNPcGVyYXRpb24uRklOQUxfQ09ORElUSU9OUyksIFJlZmFjdG9yaW5nQ29yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25kaXRpb25DaGVja2luZ0ZhaWxlZFNldmVyaXR5KCkpOwotCi0gICAgICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIHBlcmZvcm1DaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjcmVhdGVDaGFuZ2VPcGVyYXRpb24pOwotCi0gICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIocGVyZm9ybUNoYW5nZU9wZXJhdGlvbik7Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChwZXJmb3JtQ2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSA9IHBhY2thZ2VOYW1lICsgZXh0cmFjdEludGVyZmFjZVByb2Nlc3Nvci5nZXRUeXBlTmFtZSgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoZnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TWV0aG9kTWFwKENYRk1vZGVsVXRpbHMuZ2V0TWV0aG9kTWFwKEpEVFV0aWxzLmZpbmRUeXBlKG1vZGVsLmdldFByb2plY3ROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgICAgIHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlID0gcGVyZm9ybUNoYW5nZU9wZXJhdGlvbi5nZXRVbmRvQ2hhbmdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaXRlKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgaWYgKHVuZG9FeHRyYWN0SW50ZXJmYWNlQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbih1bmRvRXh0cmFjdEludGVyZmFjZUNoYW5nZSk7Ci0KLSAgICAgICAgICAgICAgICBXb3JrYmVuY2hSdW5uYWJsZUFkYXB0ZXIgYWRhcHRlcj0gbmV3IFdvcmtiZW5jaFJ1bm5hYmxlQWRhcHRlcihjaGFuZ2VPcGVyYXRpb24pOwotICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdXN5SW5kaWNhdG9yUnVubmFibGVDb250ZXh0KCksIGFkYXB0ZXIsIGFkYXB0ZXIuZ2V0U2NoZWR1bGluZ1J1bGUoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0aW5nUG9pbnRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmlzQ29uc2lzdGVudCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nUG9pbnRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLm1ha2VDb25zaXN0ZW50KG1vbml0b3IpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1vZGVsLnNldE1ldGhvZE1hcChDWEZNb2RlbFV0aWxzLmdldE1ldGhvZE1hcChzdGFydGluZ1BvaW50VHlwZSwgbW9kZWwpKTsKLQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGptZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaXRlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNmYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9KYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLkNYRkNyZWF0aW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewotICAgIAotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLQotICAgIHB1YmxpYyBKYXZhMldTVmFsaWRhdGVJbnB1dENvbW1hbmQoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0gICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gSkRUVXRpbHMuZmluZFR5cGUoamF2YVByb2plY3QsIG1vZGVsLmdldEphdmFTdGFydGluZ1BvaW50KCkpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAhdHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLkpBVkEyV1NfU0VSVklDRV9JTVBMX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttb2RlbC5nZXRKYXZhU3RhcnRpbmdQb2ludCgpLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpfSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5KQVZBMldTX1NFUlZJQ0VfSU1QTF9OT1RfQklOQVJZKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDQ0ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLkphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5yZXNvdXJjZXMuV2ViQ29udGVudENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5Db21tYW5kTGluZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5TcHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuSVdlYlNlcnZpY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgPGNvZGU+b3JnLmFwYWNoZS5jeGYudG9vbHMud3NkbHRvLldTRExUb0phdmE8L2NvZGU+IGNvbW1hbmQuCi0gKgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1hGX1RPT0xfQ0xBU1NfTkFNRSA9ICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0KLSAgICBwcml2YXRlIEphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGphdmFSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFDb21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwgSVdlYlNlcnZpY2Ugd3MpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgICAgICB0aGlzLndzID0gd3M7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFBhdGgobW9kZWwuZ2V0SmF2YVNvdXJjZUZvbGRlcigpKSk7Ci0gICAgICAgIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciA9IG5ldyBXZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0KLSAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFByb2plY3ROYW1lKCk7Ci0KLSAgICAgICAgLy9UT0RPIHJldmlzaXQKLSAgICAgICAgd3MuZ2V0V2ViU2VydmljZUluZm8oKS5zZXRJbXBsVVJMcyhuZXcgU3RyaW5nW10ge3Byb2plY3ROYW1lICsgIi9JbXBsLmphdmEifSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBTdHJpbmdbXSBwcm9nQXJncyA9IENvbW1hbmRMaW5lVXRpbHMuZ2V0V1NETDJKYXZhUHJvZ3JhbUFyZ3VtZW50cyhtb2RlbCk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIExhdW5jaFV0aWxzLmxhdW5jaChqYXZhUHJvamVjdCwgQ1hGX1RPT0xfQ0xBU1NfTkFNRSwgcHJvZ0FyZ3MpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXMkpGaWxlc0Zyb21UbXAobW9kZWwpOwotCi0gICAgICAgICAgICBpZiAobW9kZWwuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTcHJpbmdVdGlscy5jcmVhdGVDb25maWd1cmF0aW9uRnJvbVdTREwobW9kZWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgaW9lLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqYXZhUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgRmlsZVV0aWxzLnJlZnJlc2hQcm9qZWN0KHByb2plY3ROYW1lLCBtb25pdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgTGlzdDxJUmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PElSZXNvdXJjZT4oKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwoamF2YVJlc291cmNlQ2hhbmdlTGlzdGVuZXIuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLSAgICAgICAgY2hhbmdlZFJlc291cmNlcy5hZGRBbGwod2ViQ29udGVudENoYW5nZUxpc3RlbmVyLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7Ci0gICAgICAgIGlmIChjaGFuZ2VkUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogY2hhbmdlZFJlc291cmNlcykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgcHVibGljIENYRkRhdGFNb2RlbCBnZXRDWEZEYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvL0FOVCBFbnZpcm9ubWVudCBNYXBwaW5ncwotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2VGb2xkZXIoU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlTmFtZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgbW9kZWwuc2V0U2VydmljZU5hbWUoc2VydmljZU5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlU2VydmVyKGJvb2xlYW4gZ2VuZXJhdGVTZXJ2ZXIpIHsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oYm9vbGVhbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXNlRGVmYXVsdFZhbHVlcyhib29sZWFuIHVzZURlZmF1bHRWYWx1ZXMpIHsKLSAgICAgICAgbW9kZWwuc2V0VXNlRGVmYXVsdFZhbHVlcyh1c2VEZWZhdWx0VmFsdWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU09BUEhlYWRlcnMoYm9vbGVhbiBwcm9jZXNzU09BUEhlYWRlcnMpIHsKLSAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhsb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoYm9vbGVhbiBsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZykgewotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyhsb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXV0b05hbWVSZXNvbHV0aW9uKGJvb2xlYW4gYXV0b05hbWVSZXNvbHV0aW9uKSB7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihhdXRvTmFtZVJlc29sdXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFhqY1VzZURlZmF1bHRWYWx1ZXMoYm9vbGVhbiB4amNVc2VEZWZhdWx0VmFsdWVzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1VzZURlZmF1bHRWYWx1ZXMoeGpjVXNlRGVmYXVsdFZhbHVlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmcoYm9vbGVhbiB4amNUb1N0cmluZykgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdTaW1wbGUoYm9vbGVhbiB4amNUb1N0cmluZ1NpbXBsZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ1NpbXBsZSh4amNUb1N0cmluZ1NpbXBsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjVG9TdHJpbmdNdWx0aUxpbmUoYm9vbGVhbiB4amNUb1N0cmluZ011bHRpTGluZSkgewotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0WGpjTG9jYXRvcihib29sZWFuIHhqY0xvY2F0b3IpIHsKLSAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNTeW5jTWV0aG9kcyhib29sZWFuIHhqY1N5bmNNZXRob2RzKSB7Ci0gICAgICAgIG1vZGVsLnNldFhqY1N5bmNNZXRob2RzKHhqY1N5bmNNZXRob2RzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRYamNNYXJrR2VuZXJhdGVkKGJvb2xlYW4geGpjTWFya0dlbmVyYXRlZCkgewotICAgICAgICBtb2RlbC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWQpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVkTmFtZXNwYWNlcyhNYXAgdmFsdWUpIHsKLSAgICAgICAgbW9kZWwuc2V0SW5jbHVkZWROYW1lc3BhY2VzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCaW5kaW5nRmlsZXMoTGlzdDxTdHJpbmc+IGJpbmRpbmdGaWxlcykgewotICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogYmluZGluZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5hZGQocGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGMxMTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL2NvcmUvY29tbWFuZHMvV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEJ1ZyAjMjcxNTYyIC0gc3VkaGFuQHByb2dyZXNzLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgud3NkbC5EZWZpbml0aW9uOwotaW1wb3J0IGphdmF4LndzZGwuUG9ydDsKLWltcG9ydCBqYXZheC53c2RsLlBvcnRUeXBlOwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUucmVzb3VyY2VzLldlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5DWEZDcmVhdGlvbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuV1NETFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnV0aWwuV1NETENvcGllcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBpbnB1dFVSTDsKLQotICAgIHByaXZhdGUgV2ViQ29udGVudENoYW5nZUxpc3RlbmVyIHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGlucHV0VVJMKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotICAgICAgICB0aGlzLmlucHV0VVJMID0gaW5wdXRVUkw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgImRlcHJlY2F0aW9uIiB9KQotICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgd2ViQ29udGVudENoYW5nZUxpc3RlbmVyID0gbmV3IFdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lcihwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0KLSAgICAgICAgV1NETDJKYXZhUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdTREwySmF2YUNvbnRleHQoKTsKLSAgICAgICAgbW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCkpOwotICAgICAgICBtb2RlbC5zZXREZWZhdWx0UnVudGltZVR5cGUoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSk7Ci0gICAgICAgIC8vCi0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIG1vZGVsLnNldEdlbmVyYXRlU2VydmVyKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0RGF0YWJpbmRpbmcoY29udGV4dC5nZXREYXRhYmluZGluZygpKTsKLSAgICAgICAgbW9kZWwuc2V0RnJvbnRlbmQoY29udGV4dC5nZXRGcm9udGVuZCgpKTsKLSAgICAgICAgbW9kZWwuc2V0V3NkbFZlcnNpb24oY29udGV4dC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVBbnRCdWlsZEZpbGUoY29udGV4dC5pc0dlbmVyYXRlQW50QnVpbGRGaWxlKCkpOwotICAgICAgICBtb2RlbC5zZXRJbmNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotICAgICAgICBtb2RlbC5zZXRFeGNsdWRlZE5hbWVzcGFjZXMobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOwotCi0gICAgICAgIC8vIFhKQwotICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNUb1N0cmluZyhjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNvbnRleHQuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgbW9kZWwuc2V0WGpjVG9TdHJpbmdTaW1wbGUoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNMb2NhdG9yKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICBtb2RlbC5zZXRYamNTeW5jTWV0aG9kcyhjb250ZXh0LmlzWGpjU3luY01ldGhvZHMoKSk7Ci0gICAgICAgIG1vZGVsLnNldFhqY01hcmtHZW5lcmF0ZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0KLSAgICAgICAgbW9kZWwuc2V0VmFsaWRhdGUoY29udGV4dC5pc1ZhbGlkYXRlKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9jZXNzU09BUEhlYWRlcnMoY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZyhjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXMoY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG1vZGVsLnNldEF1dG9OYW1lUmVzb2x1dGlvbihjb250ZXh0LmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICBtb2RlbC5zZXROb0FkZHJlc3NCaW5kaW5nKGNvbnRleHQuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICBtb2RlbC5zZXRVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoY29udGV4dC5pc1VzZVNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihKRFRVdGlscy5nZXRKYXZhUHJvamVjdFNvdXJjZURpcmVjdG9yeVBhdGgobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSkudG9PU1N0cmluZygpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBVUkwgd3NkbFVybCA9IG5ldyBVUkwoaW5wdXRVUkwpOwotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsVXJsKTsKLSAgICAgICAgICAgIGlmICh3c2RsVXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmICghRmlsZVV0aWxzLmlzRmlsZUluV2ViQ29udGVudEZvbGRlcihwcm9qZWN0LCBuZXcgUGF0aCh3c2RsVXJsLmdldFBhdGgoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElGb2xkZXIgd3NkbEZvbGRlciA9IFdTRExVdGlscy5nZXRXU0RMRm9sZGVyKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IHdzZGxGb2xkZXIuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlVG9Db3B5ID0gbmV3IEZpbGUod3NkbFVybC50b1VSSSgpKTsKLSAgICAgICAgICAgICAgICAgICAgV1NETENvcGllciBjb3BpZXIgPSBuZXcgV1NETENvcGllcigpOwotICAgICAgICAgICAgICAgICAgICAvL2ZvciBFY2xpcHNlIDMuMyBjb21wYXRpYmlsaXR5Ci0gICAgICAgICAgICAgICAgICAgIGNvcGllci5zZXRTb3VyY2VVUkkod3NkbFVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgICAgICAgICAgY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyLmdldExvY2F0aW9uVVJJKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotICAgICAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IHdzZGxGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKGZpbGVUb0NvcHkuZ2V0TmFtZSgpKS50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbFVSTCh3c2RsRmlsZS50b1VSTCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiA9IFdTRExVdGlscy5yZWFkV1NETChtb2RlbC5nZXRXc2RsVVJMKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VE5TT25Nb2RlbChkZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0V1NETExvY2F0aW9uKGRlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uID0gV1NETFV0aWxzLnJlYWRXU0RMKHdzZGxVcmwpOwotICAgICAgICAgICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBzZXJ2aWNlc1NldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldFROU09uTW9kZWwoZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIHNldFdTRExMb2NhdGlvbihkZWZpbml0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeSBzZXJ2aWNlRW50cnkgOiBzZXJ2aWNlc1NldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeT4gcG9ydHNTZXQgPSBwb3J0c01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0IHBvcnQgPSAoUG9ydCkgcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydFR5cGUgcG9ydFR5cGUgPSBwb3J0LmdldEJpbmRpbmcoKS5nZXRQb3J0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gcG9ydFR5cGUuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHFOYW1lLmdldExvY2FsUGFydCgpICsgV1NETFV0aWxzLldTRExfRklMRV9FWFRFTlNJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSVBhdGggd3NkbEZvbGRlclBhdGggPSBXU0RMVXRpbHMuZ2V0V1NETEZvbGRlcihwcm9qZWN0KS5nZXRMb2NhdGlvbigpOwotICAgICAgICAgICAgICAgIFdTRExDb3BpZXIgY29waWVyID0gbmV3IFdTRExDb3BpZXIoKTsKLSAgICAgICAgICAgICAgICBjb3BpZXIuc2V0U291cmNlVVJJKHdzZGxVcmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICAgICAgY29waWVyLnNldFRhcmdldEZvbGRlclVSSSh3c2RsRm9sZGVyUGF0aC50b0ZpbGUoKS50b1VSSSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGNvcGllci5zZXRUYXJnZXRGaWxlbmFtZShmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgd29ya3NwYWNlLnJ1bihjb3BpZXIsIG1vbml0b3IpOwotCi0gICAgICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IHdzZGxGb2xkZXJQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKGZpbGVuYW1lKS50b0ZpbGUoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRXc2RsVVJMKHdzZGxGaWxlLnRvVVJJKCkudG9VUkwoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtb2RlbC5zZXRXc2RsRmlsZU5hbWUoZ2V0V1NETEZpbGVOYW1lRnJvbVVSTChtb2RlbC5nZXRXc2RsVVJMKCkpKTsKLQotICAgICAgICAgICAgSVBhdGggd3NkbExvY2F0aW9uUGF0aCA9IG5ldyBQYXRoKG1vZGVsLmdldFdzZGxVUkwoKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgd3NkbExvY2F0aW9uUGF0aCA9IHdzZGxMb2NhdGlvblBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihwcm9qZWN0KQotICAgICAgICAgICAgICAgICAgICAuZ2V0TG9jYXRpb24oKS5tYXRjaGluZ0ZpcnN0U2VnbWVudHMod3NkbExvY2F0aW9uUGF0aCkpOwotCi0gICAgICAgICAgICBpZiAod3NkbExvY2F0aW9uUGF0aC5nZXREZXZpY2UoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd3NkbExvY2F0aW9uUGF0aCA9IHdzZGxMb2NhdGlvblBhdGguc2V0RGV2aWNlKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbERlZmluaXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBtb2RlbC5zZXRDb25maWdXc2RsTG9jYXRpb24od3NkbExvY2F0aW9uUGF0aC50b1N0cmluZygpKTsKLQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCB1cmlzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVQbHVnaW4ubG9nKG11cmxlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgfQotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih3ZWJDb250ZW50Q2hhbmdlTGlzdGVuZXIpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0V1NETEZpbGVOYW1lRnJvbVVSTChVUkwgd3NkbFVSTCkgewotICAgICAgICBJUGF0aCB3c2RsUGF0aCA9IG5ldyBQYXRoKHdzZGxVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgIHJldHVybiB3c2RsUGF0aC5sYXN0U2VnbWVudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRXU0RMTG9jYXRpb24oRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHdzZGxMb2NhdGlvbiA9IFdTRExVdGlscy5nZXRXU0RMTG9jYXRpb24oZGVmaW5pdGlvbik7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbW9kZWwuc2V0V3NkbExvY2F0aW9uKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VE5TT25Nb2RlbChEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IGRlZmluaXRpb24uZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFdTRExVdGlscy5nZXRQYWNrYWdlTmFtZUZyb21OYW1lc3BhY2UodGFyZ2V0TmFtZXNwYWNlKTsKLSAgICAgICAgbW9kZWwuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0gICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLnB1dCh0YXJnZXROYW1lc3BhY2UsIHBhY2thZ2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV1NETDJKYXZhRGF0YU1vZGVsIGdldFdTREwySmF2YURhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIExpc3Q8SVJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxJUmVzb3VyY2U+KCk7Ci0gICAgICAgIGNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHdlYkNvbnRlbnRDaGFuZ2VMaXN0ZW5lci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotICAgICAgICBpZiAoY2hhbmdlZFJlc291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlUGx1Z2luLmxvZyhzdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1vZGVsLmdldEJpbmRpbmdGaWxlcygpLmNsZWFyKCk7Ci0gICAgICAgIG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi9jb3JlL2NvbW1hbmRzL1dTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYTBjNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vY29yZS9jb21tYW5kcy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5TdGF0dXNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHN0b3AgZ2FwIHdvcmthcm91bmQgZm9yIGJ1Z3MgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI4NiI+IzI0MzI4NjwvYT4KLSAqIGFuZCA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQzMjkwIj4jMjQzMjkwPC9hPgotICoKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElQcm9qZWN0IGluaXRpYWxQcm9qZWN0OwotICAgIHByaXZhdGUgSVByb2plY3Qgc2VydmVyUHJvamVjdDsKLSAgICBwcml2YXRlIElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0OwotCi0gICAgcHVibGljIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgICAgICBpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCAmJiBpbml0aWFsUHJvamVjdCA9PSBudWxsICYmIHNlcnZlclByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIG1vZGVsLnNldFByb2plY3ROYW1lKHNlcnZlclByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY3VycmVudFByb2plY3QgPT0gbnVsbCAmJiBpbml0aWFsUHJvamVjdCAhPSBudWxsICYmICFpbml0aWFsUHJvamVjdC5lcXVhbHMoc2VydmVyUHJvamVjdCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBDWEZDb3JlUGx1Z2luLlBMVUdJTl9JRCwgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25Db3JlTWVzc2FnZXMuV1NETDJKQVZBX1BST0pFQ1RfU0VMRUNUSU9OX0VSUk9SLCBuZXcgT2JqZWN0W117Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUHJvamVjdC5nZXROYW1lKCksIGluaXRpYWxQcm9qZWN0LmdldE5hbWUoKX0pKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsUHJvamVjdCA9PSBudWxsICYmIGN1cnJlbnRQcm9qZWN0ICE9IG51bGwgJiYgIWN1cnJlbnRQcm9qZWN0LmVxdWFscyhzZXJ2ZXJQcm9qZWN0KSkgewotICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvbkNvcmVNZXNzYWdlcy5XU0RMMkpBVkFfUFJPSkVDVF9TRUxFQ1RJT05fRVJST1IsIG5ldyBPYmplY3RbXXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LmdldE5hbWUoKSwgY3VycmVudFByb2plY3QuZ2V0TmFtZSgpfSkpOwotICAgICAgICB9IGVsc2UgaWYgKGluaXRpYWxQcm9qZWN0ICE9IG51bGwgJiYgY3VycmVudFByb2plY3QgIT0gbnVsbCAmJiAhY3VycmVudFByb2plY3QuZXF1YWxzKHNlcnZlclByb2plY3QpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQ1hGQ29yZVBsdWdpbi5QTFVHSU5fSUQsIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uQ29yZU1lc3NhZ2VzLldTREwySkFWQV9QUk9KRUNUX1NFTEVDVElPTl9FUlJPUiwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TmFtZSgpLCBjdXJyZW50UHJvamVjdC5nZXROYW1lKCl9KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc2VydmVyUHJvamVjdCAhPSBudWxsICYmIHNlcnZlclByb2plY3QuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRQcm9qZWN0TmFtZShzZXJ2ZXJQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXN0YXR1cy5pc09LKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKS5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0KHN0YXR1cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChTdGF0dXNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuIE1ha2Ugc3VyZSB0aGUgIlNlcnZpY2UgUHJvamVjdCIKLSAgICAgKiBhbmQgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgd3NkbCBmaWxlIG1hdGNoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclByb2plY3QoSVByb2plY3Qgc2VydmVyUHJvamVjdCkgewotICAgICAgICB0aGlzLnNlcnZlclByb2plY3QgPSBzZXJ2ZXJQcm9qZWN0OwotICAgIH0KLQotICAgIC8qCi0gICAgICoKLSAgICAgKiBUaGUgaW5pdGlhbCBwcm9qZWN0IHdpbGwgYmUgbnVsbCB3aGVuIHRoZXJlJ3Mgbm90aGluZyBzZWxlY3RlZCBpbiB0aGUgcHJvamVjdCBleHBsb3JlcgotICAgICAqIFRoaXMgZm9yY2VzIHRoZSB1c2VyIHRvIG1ha2UgYSBzZWxlY3Rpb24gdGh1cyBzZXR0aW5nIHRoZSBjdXJyZW50IHByb2plY3QKLSAgICAgKiBiZWxvdy4KLSAgICAgKgotICAgICAqIElmIHRoZXJlIHdhcyBhbiBpbml0aWFsIHNlbGVjdGlvbiBhbmQgdGhlIHVzZXIgY2hhbmdlcyBmcm9tIG9uZSB0b3AgZG93biBzZXJ2aWNlCi0gICAgICogdHlwZSB0byBhbm90aGVyIHRoZW4gd2UgaGFkIHRvIGNoZWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEluaXRpYWxQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgdGhpcy5pbml0aWFsUHJvamVjdCA9IHByb2plY3Q7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSB3YXMgYW4gaW5pdGlhbCBzZWxlY3Rpb24gaW4gdGhlIHByb2plY3QgZXhwbG9yZXIgdGhlIGFib3ZlIHZhbHVlIGlzIHNldCBhbmQKLSAgICAgKiB0aGlzIGlzIHNldCB0byBudWxsLgotICAgICAqCi0gICAgICogVGhpcyB3aWxsIGNoYW5nZSBob3dldmVyIGlmIHRoZSB1c2VyIG1vZGlmaWVzIHRoZSB0ZXh0IGZpZWxkIG9yIGJyb3dzZXMgZm9yIGEKLSAgICAgKiB3c2RsIGZpbGUuIFVwb24gc2VsZWN0aW5nIGEgZmlsZSBpbiBhIHZhbGlkIGxvY2F0aW9uLCB0aGlzIHZhbHVlIGdldHMgc2V0LgotICAgICAqIE5vIHByb2JsZW0gaW4gdGhhdCBzaXR1YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjUzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhZGQxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jRnJpIE5vdiAwNyAyMzo1ODo1NSBFU1QgMjAwOAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmJjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC40LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud3NydDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4yMDQsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29yZTtidW5kbGUtdmVyc2lvbj0iMC40LjMiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24uY29yZTtidW5kbGUtdmVyc2lvbj0iMC4zLjUiLAotIG9yZy5lY2xpcHNlLndzdC53cztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpO2J1bmRsZS12ZXJzaW9uPSIwLjMuNSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi51aTtidW5kbGUtdmVyc2lvbj0iMC4zLjMiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudjtidW5kbGUtdmVyc2lvbj0iWzEuMC4zMDUsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjMwNCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQ3JlYXRlZC1CeTogMS41LjBfMTQtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5qd3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmMjk1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0MmU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi9mYWxzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDliMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi90cnVlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9pY29ucy9vYmoxNi90cnVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTJiNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBDcmVhdGlvbiBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUNYRl9XU19SVU5USU1FX0xBQkVMPUFwYWNoZSBDWEYgMi54ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3ZTY3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS5ydW50aW1lcyI+Ci0gICAgICA8cnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGxhYmVsPSIlQ1hGX1dTX1JVTlRJTUVfTEFCRUwiCi0gICAgICAgIHNlcnZlclJlcXVpcmVkPSJmYWxzZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0JPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEpBWC1XUyBKYXZhIEZpcnN0IGFuZCBXU0RMIEZpcnN0IGluIHdlYiBwcm9qZWN0cyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuc2VydmljZVJ1bnRpbWVzIj4KLSAgICAgIDxzZXJ2aWNlUnVudGltZQotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi5qYXZhIiAKLSAgICAgICAgc2VydmljZUltcGxlbWVudGF0aW9uVHlwZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3Mud3NJbXBsLmphdmEiCi0gICAgICAgIHJ1bnRpbWVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jeGZXZWJTZXJ2aWNlUlQiCi0gICAgICAgIGJvdHRvbVVwPSJ0cnVlIgotICAgICAgICB0b3BEb3duPSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iMi40IiBhbGxvdy1uZXdlcj0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWQtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmphdmEiIHZlcnNpb249IjUuMCIgYWxsb3ctbmV3ZXI9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICA8L3NlcnZpY2VSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gICAgPCEtLSBkZWZpbmUgc3VwcG9ydCBmb3IgQ1hGIEphdmEgY2xpZW50cyBpbiBXZWIgcHJvamVjdHMgLS0+Ci0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmNsaWVudFJ1bnRpbWVzIj4KLSAgICAgICA8Y2xpZW50UnVudGltZQotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvbnN1bXB0aW9uLndlYiIKLSAgICAgICAgICBjbGllbnRJbXBsZW1lbnRhdGlvblR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LndzLmNsaWVudC50eXBlLmphdmEiCi0gICAgICAgICAgcnVudGltZUlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmN4ZldlYlNlcnZpY2VSVCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VSdW50aW1lIj4KLQotICAgICAgICAgIDxyZXF1aXJlZC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjQiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSI1LjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkLWZhY2V0LXZlcnNpb24gZmFjZXQ9ImN4Zi5jb3JlIiB2ZXJzaW9uPSIxLjAiIGFsbG93LW5ld2VyPSJ0cnVlIi8+Ci0gICAgICAgPC9jbGllbnRSdW50aW1lPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgICA8IS0tIGJ1Z3MgIzI0MzI4NiAjMjQzMjkwIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi51aS53aWRnZXRSZWdpc3RyeSI+Ci0gICAgICAgPHdpZGdldEZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25XaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJQcm9qZWN0U2VsZWN0aW9uQ29uZmlnIgotICAgICAgICAgICAgIGluc2VydEJlZm9yZUNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kIi8+Ci0gICAgPC9leHRlbnNpb24+IAotCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NQcmVDaGVja0NvbmZpZyIKLSAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkpBWFdTQW5ub3RhdGVDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kIj4KLSAgICAgICA8L3dpZGdldEZhY3Rvcnk+Ci0gICAgPC9leHRlbnNpb24+Ci0gCi0gICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LnVpLndpZGdldFJlZ2lzdHJ5Ij4KLSAgICAgICA8d2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHMuSmF2YTJXU0NvbmZpZ1dpZGdldEZhY3RvcnkiCi0gICAgICAgICAgICAgaWQ9IkphdmEyV1NDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiPgotICAgICAgIDwvd2lkZ2V0RmFjdG9yeT4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYudWkud2lkZ2V0UmVnaXN0cnkiPgotICAgICAgIDx3aWRnZXRGYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0cy5XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5IgotICAgICAgICAgICAgIGlkPSJXU0RMMkphdmFDb25maWciCi0gICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCI+Ci0gICAgICAgPC93aWRnZXRGYWN0b3J5PgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotICAgIDwhLS0gSkFWQTJXUyAtLT4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnYuYW50RGF0YU1hcHBpbmciPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkNsaWVudCIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVDbGllbnQiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5TZXJ2ZXIiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlU2VydmVyIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iR2VuV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbnMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJHZW5XU0RMIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVdTREwiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJXc2RsRmlsZU5hbWUiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IldzZGxGaWxlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblhTREltcG9ydHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlWFNESW1wb3J0cyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0NvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlVzZVNPQVAxMkJpbmRpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICA8L2V4dGVuc2lvbj4KLQotICAgIDwhLS0gV1NETDJKYXZhIC0tPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmVudi5hbnREYXRhTWFwcGluZyI+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0iTWFwcGluZ3MiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iSW5jbHVkZWROYW1lc3BhY2VzIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmVudi5hbnQuTWFwcGluZ3NUcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkJpbmRpbmdzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkJpbmRpbmdGaWxlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5lbnYuYW50LkJpbmRpbmdzVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJKYXZhT3V0cHV0IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IkphdmFTb3VyY2VGb2xkZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJTZXJ2aWNlTmFtZSIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlTmFtZSIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlblNlcnZlciIKLSAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kIgotICAgICAgICAgICAgIHByb3BlcnR5PSJHZW5lcmF0ZVNlcnZlciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkdlbkltcGwiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iR2VuZXJhdGVJbXBsZW1lbnRhdGlvbiIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iVXNlRGVmYXVsdFZhbHVlcyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkV4dFNPQVBIZWFkZXJzIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlByb2Nlc3NTT0FQSGVhZGVycyIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9IkRlZmF1bHROYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJEZWZhdWx0RXhjbHVkZXNOYW1lc3BhY2UiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJBdXRvTmFtZVJlc29sdXRpb24iCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iQXV0b05hbWVSZXNvbHV0aW9uIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2R2IgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1VzZURlZmF1bHRWYWx1ZXMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmciCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfbXVsdGkiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjVG9TdHJpbmdNdWx0aUxpbmUiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfdHNfc2ltcGxlIgotICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YUNvbW1hbmQiCi0gICAgICAgICAgICAgcHJvcGVydHk9IlhqY1RvU3RyaW5nU2ltcGxlIgotICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmFudC5TdHJpbmcyQm9vbGVhblRyYW5zZm9ybWVyIi8+Ci0gICAgICAgPG1hcAotICAgICAgICAgICAgIGtleT0ieGpjX2xvY2F0b3IiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTG9jYXRvciIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgICAgIDxtYXAKLSAgICAgICAgICAgICBrZXk9InhqY19zeW5jX21ldGhvZHMiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjU3luY01ldGhvZHMiCi0gICAgICAgICAgICAgdHJhbnNmb3JtPSJvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuYW50LlN0cmluZzJCb29sZWFuVHJhbnNmb3JtZXIiLz4KLSAgICAgICA8bWFwCi0gICAgICAgICAgICAga2V5PSJ4amNfbWFya19nZW5lcmF0ZWQiCi0gICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhQ29tbWFuZCIKLSAgICAgICAgICAgICBwcm9wZXJ0eT0iWGpjTWFya0dlbmVyYXRlZCIKLSAgICAgICAgICAgICB0cmFuc2Zvcm09Im9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5hbnQuU3RyaW5nMkJvb2xlYW5UcmFuc2Zvcm1lciIvPgotICAgIDwvZXh0ZW5zaW9uPgotCi0gPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL0NYRkNyZWF0aW9uVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDNhNDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAKLSAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRU5URVJfU0VJX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FTlRFUl9WQUxJRF9XU0RMX05BTUU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0NMQVNTX0NPTkZJR19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ0xBU1NfQ09ORklHX1BBR0VfREVTQ1JJUFRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0lOVEVSRkFDRV9DT05GSUdfUEFHRV9ERVNDUklQVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1BSRVZJRVc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVEVfSkpBVkFfV0lER0VUX1NFTEVDVF9NRVRIT0RfVE9fQU5OT1RBVEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFHRV9ERVNDUklQVElPTjsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HUk9VUF9MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9MQUJFTDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9GT1VORDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotICAgICAgICBOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDWEZDcmVhdGlvblVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzKCkgewotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNmZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRkNyZWF0aW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotICAgIC8vIFRoZSBwbHVnLWluIElECi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ1hGQ3JlYXRpb25VSVBsdWdpbiBwbHVnaW47Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgQ1hGQ3JlYXRpb25VSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZDcmVhdGlvblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBwbHVnaW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbgotICAgICAqIHJlbGF0aXZlIHBhdGgKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGF0aAotICAgICAqICAgICAgICAgICAgdGhlIHBhdGgKLSAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9DWEZDcmVhdGlvblVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlNDJkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvQ1hGQ3JlYXRpb25VSW1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0phdmEyV1MgUHJlIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRT17MH0gezF9IFdlYiBTZXJ2aWNlIEphdmEgQ2xhc3MgU3RhcnRpbmcgUG9pbnQgQ29uZmlndXJhdGlvbgotSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTj1TZWxlY3QgYW4gZXhpc3RpbmcgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgKFNFSSkgb3IgY3JlYXRlIGFuIFNFSSBieSBleHRyYWN0aW5nIGFuIGludGVyZmFjZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KLQotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKYXZhIEludGVyZmFjZSBTdGFydGluZyBQb2ludCBDb25maWd1cmF0aW9uCi1KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfUFJFVklFVz1QcmV2aWV3OgotSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfREVTQ1JJUFRJT049U2VsZWN0IGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaW1wbGVtZW50cyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIFNFSS4KLQotI0phdmEyV1MgQ29uZmlnIFdpZGdldCBGYWN0b3J5Ci1KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBKQVgtV1MgQW5ub3RhdGlvbnMgQ29uZmlndXJhdGlvbgotSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OPU9wdGlvbmFsbHksIHNlbGVjdCB0aGUgSkFYLVdTIEFubm90YXRpb25zIHRvIGFkZC4KLQotSkFWQTJXU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgSmF2YTJXUyBDb25maWd1cmF0aW9uCi1KQVZBMldTX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gSmF2YSB0byBXUyBvcHRpb25zLgotCi0jV1NETDJKYXZhIENvbmZpZyBXaWRnZXQgRmFjdG9yeQotV1NETDJKQVZBX1BBR0VfVElUTEU9ezB9IHsxfSBXZWIgU2VydmljZSBXU0RMMkphdmEgQ29uZmlndXJhdGlvbgotV1NETDJKQVZBX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSB7MH0gV1NETCB0byBKYXZhIG9wdGlvbnMuCi0KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX1RJVExFPXswfSB7MX0gV2ViIFNlcnZpY2UgV1NETDJKYXZhIENvbmZpZ3VyYXRpb24KLVdTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OPVRoZSBwYWdlIGFsbG93cyB0aGUgb3ZlcnJpZGluZyBvZiB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcyBmb3IgdGhpcyBXZWIgU2VydmljZSBnZW5lcmF0aW9uLgotCi0jSmF2YTJXUyBDb25maWcgV2lkZ2V0Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotCi1KQVZBMldTX0VOVEVSX1NFSV9OQU1FPVBsZWFzZSBlbnRlciB0aGUgbmFtZSBvZiB0aGUgU0VJIHRvIGV4dHJhY3QKLUpBVkEyV1NfU0VMRUNUX1NFSV9FWFRSQUNURURfTUVUSE9EUz1QbGVhc2Ugc2VsZWN0IHRoZSBtZXRob2RzIHlvdSB3aXNoIHRvIGV4dHJhY3QgZnJvbSB0aGUgezB9IGNsYXNzCi1KQVZBMldTX1NFTEVDVF9TRUlfTUVTU0FHRT1QbGVhc2Ugc2VsZWN0IGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLUpBVkEyV1NfU0VMRUNUX1NFSV9PUFRJT049UGxlYXNlIHNlbGVjdCBhbiBTRUkgb3B0aW9uCi1KQVZBMldTX1NFTEVDVF9TRUlfRElBTE9HX1RJVExFPVNlbGVjdCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEludGVyZmFjZSB0byB1c2UgYXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi1KQVZBMldTX1NFTEVDVF9TRUlfV0VCU0VSVklDRV9OQU1FX0FUVFJJQlVURV9QUkVTRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIGNvbnRhaW5zIGFuIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gd2l0aCBhIG5hbWUgYXR0cmlidXRlIHdoaWNoIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZQotSkFWQTJXU19TRUxFQ1RfSU1QTF9ESUFMT0dfVElUTEU9U2VsZWN0IGFuIEltcGxlbWVudGF0aW9uCi1KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTj1TZWxlY3QgdGhlIEltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgdGhlIFdlYiBTZXJ2aWNlCi0KLUpBVkEyV1NfRU5URVJfVkFMSURfV1NETF9OQU1FPVBsZWFzZSBlbnRlciBhIHZhbGlkIFdTREwgRmlsZSBuYW1lCi0KLSNXU0RMMkphdmEgRGVmYXVsdHMgQ29uZmlnIFdpZGdldAotV1NETDJKQVZBX0dST1VQX0xBQkVMPVdTREwySmF2YSBHZW5lcmF0aW9uIE9wdGlvbnMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX0xBQkVMPVhKQyBBcmd1bWVudHMKLUpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9TRUxFQ1RfTUVUSE9EX1RPX0FOTk9UQVRFPVNlbGVjdCB0aGUgTWV0aG9kcyB0byBhbm5vdGF0ZToKLQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UPUltcGxlbWVudGF0aW9uIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBTRUkgbWV0aG9kICcnezB9JycKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORD1UaGUgSW1wbGVtZW50YXRpb24gJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS9zZWxlY3Rpb24vSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1NDY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvc2VsZWN0aW9uL0lTdHJ1Y3R1cmVkU2VsZWN0aW9uVG9JUHJvamVjdFRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuVHJhbnNmb3JtZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSVN0cnVjdHVyZWRTZWxlY3Rpb25Ub0lQcm9qZWN0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lciB7Ci0KLSAgICBwdWJsaWMgT2JqZWN0IHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmFsdWU7Ci0gICAgICAgIE9iamVjdCBmaXJzdEVsZW1lbnQgPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS92aWV3ZXJzL0Fubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNTdmYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3ZpZXdlcnMvQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQ29sdW1uTGFiZWxQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBJbWFnZSBhZGRBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBkaXNhYmxlZDsKLQotICAgIHByaXZhdGUgTWFwPElNZXRob2QsIE1hcDxTdHJpbmcsIEJvb2xlYW4+PiBtZXRob2RNYXA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLSAgICBwcml2YXRlIElUeXBlIHR5cGU7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIGFubm90YXRpb25LZXksIElUeXBlIHR5cGUpIHsKLSAgICAgICAgdGhpcy5tZXRob2RNYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uS2V5ID0gYW5ub3RhdGlvbktleTsKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgYWRkQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi90cnVlLmdpZiIpLmNyZWF0ZUltYWdlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVtb3ZlQW5ub3RhdGlvbkltYWdlID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9mYWxzZS5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRpc2FibGVkID0gQ1hGQ3JlYXRpb25VSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICJpY29ucy9vYmoxNi9kaXNhYmxlZC5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNvdXJjZU1ldGhvZCkgewotICAgICAgICAgICAgaWYgKG1ldGhvZE1hcCA9PSBudWxsIHx8IGFubm90YXRpb25LZXkgPT0gbnVsbCB8fCB0eXBlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoU291cmNlTWV0aG9kKSBlbGVtZW50OwotCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbktleS5lcXVhbHMoQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gQW5ub3RhdGlvblV0aWxzLmdldFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25zKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgCUlMb2NhbFZhcmlhYmxlIHZhcmlhYmxlID0gKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQodmFyaWFibGUsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIGFubm90YXRpb25LZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWV0aG9kTWFwLmdldChtZXRob2QpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIGFkZEFubm90YXRpb24gPSAgbWV0aG9kTWFwLmdldChtZXRob2QpLmdldChhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkQW5ub3RhdGlvbkltYWdlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVBbm5vdGF0aW9uSW1hZ2U7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICBzdXBlci5kaXNwb3NlKCk7Ci0gICAgICAgIGFkZEFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIHJlbW92ZUFubm90YXRpb25JbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgIGRpc2FibGVkLmRpc3Bvc2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlSmF2YVdpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM5ZjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0pBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LlNpbXBsZUphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUNvbG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5JSmF2YVBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSmF2YVRleHRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRWRpdGluZ1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS51dGlscy5DWEZNb2RlbFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLnZpZXdlcnMuQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotICAgIHByaXZhdGUgSVR5cGUgdHlwZTsKLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIGphdmFUcmVlVmlld2VyOwotICAgIHByaXZhdGUgU291cmNlVmlld2VyIGFubm90YXRpb25QcmV2aWV3Vmlld2VyOwotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHdlYk1ldGhvZFZpZXdlckNvbHVtbjsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gd2ViUGFyYW1WaWV3ZXJDb2x1bW47Ci0gICAgcHJpdmF0ZSBUcmVlVmlld2VyQ29sdW1uIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW47Ci0KLSAgICBwdWJsaWMgSkFYV1NBbm5vdGF0ZUphdmFXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lkZ2V0RGF0YUV2ZW50cyBhZGRDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBMaXN0ZW5lciBzdGF0dXNMaXN0ZW5lcikgewotICAgICAgICBTYXNoRm9ybSBzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCB8IFNXVC5TTU9PVEgpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgc2FzaEZvcm0uc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNhc2hGb3JtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIENvbXBvc2l0ZSBqYXZhVHJlZWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc2FzaEZvcm0sIFNXVC5OT05FKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXZhVHJlZWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgb3V0bGluZUxhYmVsID0gbmV3IExhYmVsKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIG91dGxpbmVMYWJlbC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVhXU19BTk5PVEFURV9KSkFWQV9XSURHRVRfU0VMRUNUX01FVEhPRF9UT19BTk5PVEFURSk7Ci0KLSAgICAgICAgVHJlZSBqYXZhVHJlZSA9IG5ldyBUcmVlKGphdmFUcmVlY29tcG9zaXRlLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBqYXZhVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGphdmFUcmVlKTsKLQotICAgICAgICBqYXZhVHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTA7Ci0gICAgICAgIGdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLSAgICAgICAgamF2YVRyZWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBjbGFzc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIFRyZWVDb2x1bW4gY2xhc3NDb2x1bW4gPSBjbGFzc1ZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0V2lkdGgoMjAwKTsKLSAgICAgICAgY2xhc3NDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotCi0gICAgICAgIGZpbmFsIEphdmFFbGVtZW50TGFiZWxQcm92aWRlciBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgPSBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0gICAgICAgIGNsYXNzVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFFbGVtZW50TGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGphdmFUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcih0cnVlKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlW10gdHlwZXMgPSBjb21waWxhdGlvblVuaXQuZ2V0VHlwZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVR5cGUgdHlwZSA6IHR5cGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt0eXBlfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSBzb3VyY2VUeXBlID0gKElUeXBlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIG1ldGhvZHMgPSBzb3VyY2VUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlVHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSkRUVXRpbHMuaXNQdWJsaWNNZXRob2QobWV0aG9kKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdWJsaWNNZXRob2RzLnRvQXJyYXkobmV3IE9iamVjdFtwdWJsaWNNZXRob2RzLnNpemUoKV0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOT19DSElMRFJFTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgSVRyZWVTZWxlY3Rpb24gdHJlZVNlbGVjdGlvbiA9IChUcmVlU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGZpcnN0RWxlbWVudCA9IHRyZWVTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPQotICAgICAgICAgICAgICAgICAgICAJbmV3IEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNvdXJjZVR5cGUgPSAoSVR5cGUpIGZpcnN0RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZWxlbWVudE5hbWUgPSBzb3VyY2VUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxcYnB1YmxpY1xcVysoPzpcXHcrXFxXKyl7MSwzfT8iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoZWxlbWVudE5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5yZXZlYWxSYW5nZShyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWV0aG9kIHNvdXJjZU1ldGhvZCA9IChJTWV0aG9kKSBmaXJzdEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgc291cmNlVHlwZSA9IChJVHlwZSkgc291cmNlTWV0aG9kLmdldFBhcmVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gc291cmNlTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VUeXBlLmlzQ2xhc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxcYnB1YmxpYyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFxXKyg/OlxcdytcXFcrKXsxLDN9PyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKFxccyo/Lio/Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHBhcmFtdGVyTmFtZXMgPSBzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqPyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcocGFyYW1ldGVyVHlwZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQodHlwZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdleC5hcHBlbmQoIlxccyo/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZChwYXJhbXRlck5hbWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJaWYgKGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGggLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICByZWdleC5hcHBlbmQoIlxccyo/LFxccyo/Lio/Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCX0KLQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCJcXHMqP1xcKSIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAJSVJlZ2lvbiByZWdpb24gPSBmaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlci5maW5kKDAsIHJlZ2V4LnRvU3RyaW5nKCksIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVnaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlZ2lvbiBlbGVtZW50TmFtZVJlZ2lvbiA9IGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLmZpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJcmVnaW9uLmdldE9mZnNldCgpLCBlbGVtZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWVSZWdpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShlbGVtZW50TmFtZVJlZ2lvbi5nZXRPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJZWxlbWVudE5hbWVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIucmV2ZWFsUmFuZ2UoZWxlbWVudE5hbWVSZWdpb24uZ2V0T2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWVsZW1lbnROYW1lUmVnaW9uLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhibGUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVXZWJNZXRob2RWaWV3ZXJDb2x1bW4oamF2YVRyZWVWaWV3ZXIpOwotICAgICAgICBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihqYXZhVHJlZVZpZXdlcik7Ci0gICAgICAgIGNyZWF0ZVJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLSAgICAgICAgY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKGphdmFUcmVlVmlld2VyKTsKLQotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLSAgICAgICAgamF2YVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIHByZXZpZXdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHNhc2hGb3JtLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgamF2YVRyZWVjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgcHJldmlld0xhYmVsID0gbmV3IExhYmVsKHByZXZpZXdDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgcHJldmlld0xhYmVsLnNldFRleHQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRFX0pKQVZBX1dJREdFVF9QUkVWSUVXKTsKLQotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IGNyZWF0ZUFubm90YXRpb25QcmV2aWV3ZXIocHJldmlld0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSB8IFNXVC5WX1NDUk9MTAotICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSAxMDsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2FzaEZvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W117NTAsIDUwfSk7Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxpemUoKSB7Ci0gICAgICAgIHR5cGUgPSBudWxsOwotICAgICAgICB1cGRhdGVMYWJlbFByb3ZpZGVycygpOwotICAgICAgICBqYXZhVHJlZVZpZXdlci5zZXRJbnB1dChnZXRUeXBlKCkuZ2V0VHlwZVJvb3QoKSk7Ci0gICAgICAgIGphdmFUcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgaGFuZGxlQW5ub3RhdGlvbihnZXRUeXBlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUludGVyZmFjZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlID0gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSksIG1vZGVsCi0gICAgICAgICAgICAgICAgICAgIC5nZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICB9IGVsc2UgaWYgKG1vZGVsLmdldEZ1bGx5UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHR5cGUgPUpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdHlwZSA9IEpEVFV0aWxzLmZpbmRUeXBlKEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBtb2RlbAotICAgICAgICAgICAgICAgICAgICAuZ2V0SmF2YVN0YXJ0aW5nUG9pbnQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAoQ1hGTW9kZWxVdGlscy5nZXRNZXRob2RNYXAodHlwZSwgbW9kZWwpKTsKLQotICAgICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlV2ViTWV0aG9kVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJNZXRob2RDb2x1bW4gPSB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgd2ViTWV0aG9kQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYk1ldGhvZENvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHdlYk1ldGhvZFZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLldFQl9NRVRIT0QsIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJNZXRob2RWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCkpOwotICAgICAgICByZXR1cm4gd2ViTWV0aG9kVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVXZWJQYXJhbVZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiB3ZWJQYXJhbUNvbHVtbiA9IHdlYlBhcmFtVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICB3ZWJQYXJhbUNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkNFTlRFUik7Ci0gICAgICAgIHdlYlBhcmFtQ29sdW1uLnNldE1vdmVhYmxlKGZhbHNlKTsKLSAgICAgICAgd2ViUGFyYW1WaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0sIGdldFR5cGUoKSkpOwotICAgICAgICB3ZWJQYXJhbVZpZXdlckNvbHVtbi5zZXRFZGl0aW5nU3VwcG9ydChuZXcgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KHRyZWVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5XRUJfUEFSQU0pKTsKLSAgICAgICAgcmV0dXJuIHdlYlBhcmFtVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgVHJlZVZpZXdlckNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbihUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbiA9IHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRXaWR0aCgxMDApOwotICAgICAgICBjcmVhdGVSZXF1ZXN0V3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlcXVlc3RXcmFwcGVyVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVRVUVTVF9XUkFQUEVSKSk7Ci0gICAgICAgIHJldHVybiByZXF1ZXN0V3JhcHBlclZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRyZWVWaWV3ZXJDb2x1bW4gY3JlYXRlUmVzcG9uc2VXcmFwcGVyVmlld2VyQ29sdW1uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuQ0VOVEVSKTsKLSAgICAgICAgVHJlZUNvbHVtbiByZXNwb25jZVdyYXBwZXJDb2x1bW4gPSByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRUZXh0KCJAIiArIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmVzcG9uY2VXcmFwcGVyQ29sdW1uLnNldFdpZHRoKDEwMCk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlckNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIHJlc3BvbmNlV3JhcHBlclZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBbm5vdGF0aW9uQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCwKLSAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25FZGl0aW5nU3VwcG9ydCh0cmVlVmlld2VyLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuUkVTUE9OU0VfV1JBUFBFUikpOwotICAgICAgICByZXR1cm4gcmVzcG9uY2VXcmFwcGVyVmlld2VyQ29sdW1uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYWJlbFByb3ZpZGVycygpIHsKLSAgICAgICAgd2ViTWV0aG9kVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX01FVEhPRCwgZ2V0VHlwZSgpKSk7Ci0gICAgICAgIHdlYlBhcmFtVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25Db2x1bW5MYWJlbFByb3ZpZGVyKG1vZGVsLAotICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNLCBnZXRUeXBlKCkpKTsKLSAgICAgICAgcmVxdWVzdFdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVFVRVNUX1dSQVBQRVIsIGdldFR5cGUoKSkpOwotICAgICAgICByZXNwb25jZVdyYXBwZXJWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQW5ub3RhdGlvbkNvbHVtbkxhYmVsUHJvdmlkZXIobW9kZWwsCi0gICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5SRVNQT05TRV9XUkFQUEVSLCBnZXRUeXBlKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5ub3RhdGlvbihJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcoZmFsc2UpOwotCi0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSAgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgICAgICAgICAgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFubm90YXRpb24gQ2hhbmdlcyIsCi0gICAgICAgICAgICAgICAgICAgIChJRmlsZSljb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEtlZXBQcmV2aWV3RWRpdHModHJ1ZSk7Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0V2ViU2VydmljZUFubm90YXRpb25DaGFuZ2UodHlwZSwgbW9kZWwsIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgSU1ldGhvZFtdIHR5cGVNZXRob2RzID0gSkRUVXRpbHMuZ2V0UHVibGljTWV0aG9kcyh0eXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZU1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGVNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IG1ldGhvZEFubm90YXRpb25NYXAgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbk1hcC5nZXQoQ1hGTW9kZWxVdGlscy5XRUJfTUVUSE9EKSkgewotICAgICAgICAgICAgICAgICAgICBDWEZNb2RlbFV0aWxzLmdldFdlYk1ldGhvZEFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFUVVFU1RfV1JBUFBFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGTW9kZWxVdGlscy5nZXRSZXF1ZXN0V3JhcHBlckFubm90YXRpb25DaGFuZ2UodHlwZSwgbWV0aG9kLCB0ZXh0RmlsZUNoYW5nZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZXRob2RBbm5vdGF0aW9uTWFwLmdldChDWEZNb2RlbFV0aWxzLlJFU1BPTlNFX1dSQVBQRVIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0UmVzcG9uc2VXcmFwcGVyQW5ub3RhdGlvbkNoYW5nZSh0eXBlLCBtZXRob2QsIHRleHRGaWxlQ2hhbmdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZEFubm90YXRpb25NYXAuZ2V0KENYRk1vZGVsVXRpbHMuV0VCX1BBUkFNKSkgewotCQkJCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbnMobWV0aG9kKTsKLQkJCQkJZm9yIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKLQkJCQkJCUNYRk1vZGVsVXRpbHMuZ2V0V2ViUGFyYW1Bbm5vdGF0aW9uQ2hhbmdlKHR5cGUsIG1ldGhvZCwKLQkJCQkJCQkJKElMb2NhbFZhcmlhYmxlKSBwYXJhbWV0ZXIucmVzb2x2ZUJpbmRpbmcoKS5nZXRKYXZhRWxlbWVudCgpLCB0ZXh0RmlsZUNoYW5nZSk7Ci0JCQkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENYRk1vZGVsVXRpbHMuZ2V0SW1wb3J0c0NoYW5nZShjb21waWxhdGlvblVuaXQsIG1vZGVsLCB0ZXh0RmlsZUNoYW5nZSwgZmFsc2UpOwotICAgICAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQodGV4dEZpbGVDaGFuZ2UuZ2V0UHJldmlld0NvbnRlbnQobW9uaXRvcikpOwotCi0gICAgICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBtdGUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKG10ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVBbm5vdGF0aW9uUHJldmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZXMpIHsKLSAgICAgICAgSmF2YVBsdWdpbiBqYXZhUGx1Z2luID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0gICAgICAgIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBqYXZhUGx1Z2luLmdldENvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCk7Ci0gICAgICAgIEphdmFUZXh0VG9vbHMgamF2YVRleHRUb29scyA9IGphdmFQbHVnaW4uZ2V0SmF2YVRleHRUb29scygpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlciA9IG5ldyBKYXZhU291cmNlVmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgdHJ1ZSwgc3R5bGVzLCBzdG9yZSk7Ci0gICAgICAgIElDb2xvck1hbmFnZXIgY29sb3JNYW5hZ2VyID0gamF2YVRleHRUb29scy5nZXRDb2xvck1hbmFnZXIoKTsKLSAgICAgICAgU2ltcGxlSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBTaW1wbGVKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICBjb2xvck1hbmFnZXIsIHN0b3JlLCBudWxsLCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIHRydWUpOwotCi0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQotICAgICAgICBGb250IGZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXRGb250KFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1RFWFRfRk9OVCk7Ci0gICAgICAgIGFubm90YXRpb25QcmV2aWV3Vmlld2VyLmdldFRleHRXaWRnZXQoKS5zZXRGb250KGZvbnQpOwotICAgICAgICBhbm5vdGF0aW9uUHJldmlld1ZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQotICAgICAgICBTdHJpbmcgc291cmNlID0gZ2V0U291cmNlRnJvbVR5cGUoZ2V0VHlwZSgpKTsKLSAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KHNvdXJjZSk7Ci0KLSAgICAgICAgSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YVRleHRUb29scygpLnNldHVwSmF2YURvY3VtZW50UGFydGl0aW9uZXIoZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgSUphdmFQYXJ0aXRpb25zLkpBVkFfUEFSVElUSU9OSU5HKTsKLSAgICAgICAgYW5ub3RhdGlvblByZXZpZXdWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCi0gICAgICAgIHJldHVybiBhbm5vdGF0aW9uUHJldmlld1ZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZyb21UeXBlKElUeXBlIHR5cGUpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgICAgICBwcml2YXRlIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja2JveENlbGxFZGl0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvbktleTsKLQotICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbkVkaXRpbmdTdXBwb3J0KFRyZWVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgYW5ub3RhdGlvbktleSkgewotICAgICAgICAgICAgc3VwZXIodmlld2VyKTsKLSAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbktleSA9IGFubm90YXRpb25LZXk7Ci0gICAgICAgICAgICBjaGVja2JveENlbGxFZGl0b3IgPSBuZXcgQ2hlY2tib3hDZWxsRWRpdG9yKHZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudCh0eXBlLmZpbmRNZXRob2RzKG1ldGhvZClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEJvb2xlYW4gYW5ub3RhdGUgPSBtb2RlbC5nZXRNZXRob2RNYXAoKS5nZXQoZWxlbWVudCkuZ2V0KGFubm90YXRpb25LZXkpOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiBhbm5vdGF0aW9uTWFwID0gbW9kZWwuZ2V0TWV0aG9kTWFwKCkuZ2V0KGVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGFubm90YXRpb25NYXAucHV0KGFubm90YXRpb25LZXksIGFubm90YXRlKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVBbm5vdGF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICAgICAgICAgIGdldFZpZXdlcigpLnJlZnJlc2godHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSkFYV1NBbm5vdGF0ZVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1MTU3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLkphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLkNYRkNyZWF0aW9uVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuY29yZS5kYXRhLkRhdGFNYXBwaW5nUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRlV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBTaW1wbGVXaWRnZXRDb250cmlidXRvciBqYXh3c0Fubm90YXRlV2lkZ2V0Q29udHJpYnV0b3I7Ci0KLSAgICBwcml2YXRlIEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0IGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0ID0gbmV3IEpBWFdTQW5ub3RhdGVKYXZhV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVXaWRnZXRDb250cmlidXRvcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0TmV4dE5hbWVkV2lkZ2V0KElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIHdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKERhdGFNYXBwaW5nUmVnaXN0cnkgZGF0YVJlZ2lzdHJ5KSB7Ci0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YTJXU0RhdGFNb2RlbCIsIEpBWFdTQW5ub3RhdGVXaWRnZXRGYWN0b3J5LmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmEyV1NEYXRhTW9kZWwoSmF2YTJXU0RhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBqYXh3c0Fubm90YXRlSmF2YVdpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0pBWFdTX0FOTk9UQVRFX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19KQVhXU19BTk5PVEFURV9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgamF4d3NBbm5vdGF0ZVdpZGdldENvbnRyaWJ1dG9yLnNldEZhY3RvcnkobmV3IFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBXaWRnZXRDb250cmlidXRvciBjcmVhdGUoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGpheHdzQW5ub3RhdGVKYXZhV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ2xhc3NDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY1Mjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5FRlM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLklGaWxlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9OQU1FX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAibmFtZSI7Ci0KLSAgICBwcml2YXRlIGludCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFM7Ci0gICAgcHJpdmF0ZSBpbnQgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUzsKLSAgICBwcml2YXRlIElNZXRob2RbXSBwdWJsaWNNZXRob2RzOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlU0VJQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHNlbGVjdFNFSUJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VTRUlCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZXh0cmFjdFNFSUJ1dHRvbjsKLQotICAgIHByaXZhdGUgQ29tYm8gc2VsZWN0U0VJQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHNlaUludGVyZmFjZU5hbWVUZXh0OwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIFRhYmxlIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZTsKLSAgICBwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0KLSAgICBwcml2YXRlIEphdmEyV1NEYXRhTW9kZWwgbW9kZWw7Ci0gICAgcHJpdmF0ZSBJVHlwZSBzdGFydGluZ1BvaW50VHlwZTsKLQotICAgIHB1YmxpYyBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGludGVybmFsaXplKCkgewotICAgICAgICBib29sZWFuIHVzZVNFSSA9IG1vZGVsLmlzVXNlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU0VJKTsKLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbih1c2VTRUkpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBpZiAoIXVzZVNFSSkgewotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgfQotICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyh1c2VTRUkpOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHModXNlU0VJKTsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0VGV4dCgiIik7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA9IDA7Ci0gICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHVzZVNFSUJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVVzZVNFSUJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICB1c2VTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHVzZVNFSSA9IHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UodXNlU0VJKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0RW5hYmxlZCh1c2VTRUkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIGlmICghdXNlU0VJKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoIiIpOwotCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVTZWxlY3RTRUlDb250cm9scyhmYWxzZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHVzZVNFSUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBwYWRkaW5nTGFiZWwgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0U0VJQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKHNlbGVjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0U0VJQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWxlY3RTRUlDb21ibyhjb21wb3NpdGUsIG1vZGVsLCBzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWxlY3RTRUlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotICAgICAgICBzZWxlY3RTRUlDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBicm93c2VTRUlCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVCcm93c2VCdXR0b24oY29tcG9zaXRlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZVNFSUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUuZ2V0U2hlbGwoKSwgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9ESUFMT0dfVElUTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0RJQUxPR19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBJSmF2YVNlYXJjaENvbnN0YW50cy5JTlRFUkZBQ0UpOwotCi0gICAgICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBzZWxlY3Rpb25EaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbkRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ZWRJbnRlcmZhY2UgPSBzZWxlY3RlZENvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNlaXMgPSBBcnJheXMuYXNMaXN0KHNlbGVjdFNFSUNvbWJvLmdldEl0ZW1zKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlaXMuY29udGFpbnMoc2VsZWN0ZWRJbnRlcmZhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RTRUlDb21iby5hZGQoc2VsZWN0ZWRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldFRleHQoc2VsZWN0ZWRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGFkZGluZ0xhYmVsID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcGFkZGluZ0xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeHRyYWN0U0VJQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGV4dHJhY3QgPSBleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldEV4dHJhY3RJbnRlcmZhY2UoZXh0cmFjdCk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGV4dHJhY3QpOwotICAgICAgICAgICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKCFleHRyYWN0KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzRXh0cmFjdEludGVyZmFjZSgpKTsKLSAgICAgICAgZXh0cmFjdFNFSUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGV4dHJhY3RTRUlCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTRUlJbnRlcmZhY2VOYW1lVGV4dChjb21wb3NpdGUpOwotICAgICAgICBzZWlJbnRlcmZhY2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlaU5hbWUgPSBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWlOYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyBpbnRlcmZhY2VOYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc2VpTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUgPSBpbnRlcmZhY2VOYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBKQVZBX1RZUEVfTkFNRV9TVEFUVVMgPSBKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBpbnRlcmZhY2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMgPSBjaGVja1R5cGVFeGlzdHMoc3RhcnRpbmdQb2ludFR5cGUsIGNvbXBpbGF0aW9uVW5pdE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWRkaW5nTGFiZWwoY29tcG9zaXRlKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVNZW1lYmVyc1RvRXh0cmFjdExhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhZGRpbmdMYWJlbChjb21wb3NpdGUpOwotCi0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlciA9IEphdmEyV1NXaWRnZXRGYWN0b3J5Ci0gICAgICAgIC5jcmVhdGVTRUlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIoY29tcG9zaXRlKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBPYmplY3RbXSBjaGVja2VkTWV0aG9kcyA9IHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotICAgICAgICAgICAgICAgIE1hcDxJTWV0aG9kLCBNYXA8U3RyaW5nLCBCb29sZWFuPj4gbWV0aG9kTWFwID0gbmV3IEhhc2hNYXA8SU1ldGhvZCwgTWFwPFN0cmluZywgQm9vbGVhbj4+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtZXRob2RNYXAucHV0KChJTWV0aG9kKWNoZWNrZWRNZXRob2RzW2ldLCBtb2RlbC5nZXRBbm5vdGF0aW9uTWFwKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRNZXRob2RNYXAobWV0aG9kTWFwKTsKLQotICAgICAgICAgICAgICAgIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPSBjaGVja2VkTWV0aG9kcy5sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICBpZiAoTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA8IE5VTUJFUl9PRl9QVUJMSUNfTUVUSE9EUykgewotICAgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPT0gTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoTlVNQkVSX09GX0NIRUNLRURfTUVUSE9EUyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlU0VJU2VsZWN0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzTGlzdGVuZXIuaGFuZGxlRXZlbnQobnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU2VsZWN0QWxsQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0gICAgICAgICAgICAgICAgVGFibGVJdGVtW10gY2hlY2tlZE1ldGhvZHMgPSBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgVGFibGVJdGVtIHRhYmxlSXRlbSA9IGNoZWNrZWRNZXRob2RzW2ldOwotICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCA9IGV2ZW50OwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5kZXRhaWwgPSBTV1QuQ0hFQ0s7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkV2ZW50Lml0ZW0gPSB0YWJsZUl0ZW07Ci0gICAgICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5oYW5kbGVTZWxlY3Qoc2VsZWN0aW9uRXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKGNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZXNlbGVjdEFsbEJ1dHRvbihjb21wb3NpdGUpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICAgICAgICAgIFRhYmxlSXRlbVtdIGNoZWNrZWRNZXRob2RzID0gc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBjaGVja2VkTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRXZlbnQuZGV0YWlsID0gU1dULkNIRUNLOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FdmVudC5pdGVtID0gdGFibGVJdGVtOwotICAgICAgICAgICAgICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuaGFuZGxlU2VsZWN0KHNlbGVjdGlvbkV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVTRUlTZWxlY3Rpb25TdGF0dXMoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgcHVibGljTWV0aG9kcyA9IEpEVFV0aWxzLmdldFB1YmxpY01ldGhvZHMoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMgPSBwdWJsaWNNZXRob2RzLmxlbmd0aDsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyLnNldElucHV0KHB1YmxpY01ldGhvZHMpOwotCi0gICAgICAgIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLSAgICAgICAgZW5hYmxlRXh0cmFjdFNFSUNvbnRyb2xzKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBpZiAobW9kZWwuaXNVc2VTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSkgewotICAgICAgICAgICAgaWYgKHNlbGVjdFNFSUNvbWJvLmluZGV4T2YobW9kZWwuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTmFtZSgpKSA9PSAtMSkgewotICAgICAgICAgICAgICAgIHNlbGVjdFNFSUNvbWJvLmFkZChtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uc2V0VGV4dChtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhSW50ZXJmYWNlTmFtZShtb2RlbC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCkgewotICAgICAgICBpZiAoIXVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIElUeXBlIHNlaVR5cGUgPSBKRFRVdGlscy5maW5kVHlwZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBzZWxlY3RTRUlDb21iby5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElNZXRob2RbXSBzZWlNZXRob2RzID0gc2VpVHlwZS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWV0aG9kIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgSU1ldGhvZFtdIGltcGxNZXRob2RzID0gc3RhcnRpbmdQb2ludFR5cGUuZmluZE1ldGhvZHMoc2VpTWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2RzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZShzZWlUeXBlLCBzZWlNZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gdmFsaWRhdGVTRUlBZGRpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1vZGVsLnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU5hbWUoc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKHNlbGVjdFNFSUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBsZW1lbnRzTWVzc2FnZShJVHlwZSBzZWlUeXBlLCBJTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcihzZWlUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKHNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVNFSUFkZGl0aW9uKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViU2VydmljZS5jbGFzcywgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfU0VMRUNUX1NFSV9XRUJTRVJWSUNFX05BTUVfQVRUUklCVVRFX1BSRVNFTlQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGQ3JlYXRpb25VSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuYWJsZVNlbGVjdFNFSUNvbnRyb2xzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNlbGVjdFNFSUNvbWJvLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgYnJvd3NlU0VJQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVFeHRyYWN0U0VJQ29udHJvbHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgc2VpSW50ZXJmYWNlTmFtZVRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGUuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBpZiAoZW5hYmxlICYmIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPCBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMpIHsKLSAgICAgICAgICAgIHNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuYWJsZSAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZW5hYmxlKSB7Ci0gICAgICAgICAgICBzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbmRNb3N0U2V2ZXJlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVNFSVNlbGVjdGlvblN0YXR1cygpIHsKLSAgICAgICAgaWYgKHVzZVNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKCFzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgIWV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX09QVElPTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBTRUlfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX01FU1NBR0UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VsZWN0U0VJQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlU0VJU2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChleHRyYWN0U0VJQnV0dG9uLmdldFNlbGVjdGlvbigpICYmIHNlaUludGVyZmFjZU5hbWVUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0VOVEVSX1NFSV9OQU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0cmFjdFNFSUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiBOVU1CRVJfT0ZfUFVCTElDX01FVEhPRFMgPiAwCi0gICAgICAgICAgICAgICAgICAgICYmIE5VTUJFUl9PRl9DSEVDS0VEX01FVEhPRFMgPT0gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0VYVFJBQ1RFRF9NRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZ1BvaW50VHlwZS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV4dHJhY3RTRUlCdXR0b24uZ2V0U2VsZWN0aW9uKCkgJiYgc2VpSW50ZXJmYWNlTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgTlVNQkVSX09GX1BVQkxJQ19NRVRIT0RTID4gMCAmJiBOVU1CRVJfT0ZfQ0hFQ0tFRF9NRVRIT0RTID4gMCkgewotICAgICAgICAgICAgICAgIFNFSV9TRUxFQ1RJT05fU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU0VJX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgSkFWQV9UWVBFX05BTUVfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgICAgIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAgICAgaWYgKEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX05BTUVfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIGlmIChKQVZBX1RZUEVfRVhJU1RTX1NUQVRVUy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQV9UWVBFX0VYSVNUU19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFNFSV9TRUxFQ1RJT05fU1RBVFVTLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLSAgICAgICAgICAgIHJldHVybiBTRUlfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChTRUlfU0VMRUNUSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpID49IEpBVkFfVFlQRV9OQU1FX1NUQVRVUy5nZXRTZXZlcml0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gU0VJX1NFTEVDVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoSkFWQV9UWVBFX0VYSVNUU19TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+PSBKQVZBX1RZUEVfTkFNRV9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9FWElTVFNfU1RBVFVTOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpBVkFfVFlQRV9OQU1FX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyBjaGVja1R5cGVFeGlzdHMoSVR5cGUgdHlwZSwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUpIHsKLSAgICAgICAgY29tcGlsYXRpb25Vbml0TmFtZSA9IGNvbXBpbGF0aW9uVW5pdE5hbWUudHJpbSgpOwotCi0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGNvbXBpbGF0aW9uVW5pdE5hbWUpOwotICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKTsKLQotICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEpBWFdTQ29yZU1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC5iaW5kKEpBWFdTQ29yZU1lc3NhZ2VzLlRZUEVfV0lUSF9OQU1FX0FMUkVBRFlfRVhJU1RTLCBuZXcgT2JqZWN0W10gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdE5hbWUsIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpIH0pKTsKLSAgICAgICAgfQotICAgICAgICBVUkkgbG9jYXRpb24gPSByZXNvdXJjZS5nZXRMb2NhdGlvblVSSSgpOwotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIGZpbGVTdG9yZSA9IEVGUy5nZXRTdG9yZShsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVTdG9yZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU0NvcmVQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLlRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZjRmNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0NvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBXU0RMX0ZJTEVOQU1FX09LX1NUQVRVUyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIFdTRExfRklMRU5BTUVfRVJST1JfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZDcmVhdGlvblVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX0VOVEVSX1ZBTElEX1dTRExfTkFNRSk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUNsaWVudEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXU0RMQnV0dG9uOwotICAgIHByaXZhdGUgQ29tYm8gc29hcEJpbmRpbmdDb21ibzsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzOwotICAgIHByaXZhdGUgVGV4dCB3c2RsRmlsZVRleHQ7Ci0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIEphdmEyV1NDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgZ2VuZXJhdGVDbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgICAgIGdlbmVyYXRlV3JhcGVyRmF1bHRCZWFuc0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgICAgIGVuYWJsZVdTRExHcm91cChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZWwuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGphdmEyd3NHcm91cCA9IG51bGw7Ci0gICAgICAgIGlmIChtb2RlbC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIC8vIEZyb250ZW5kCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAgICAgICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZENvbWJvKGNvbXBvc2l0ZSwgbW9kZWwpOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgLy8gSmF2YTJXUyBHcm91cAotICAgICAgICAgICAgamF2YTJ3c0dyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULlNIQURPV19JTik7Ci0gICAgICAgICAgICBqYXZhMndzR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19HUk9VUF9MQUJFTCk7Ci0gICAgICAgICAgICBHcmlkTGF5b3V0IGphdmEyd3NsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0gICAgICAgICAgICBqYXZhMndzbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dChqYXZhMndzbGF5b3V0KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBqYXZhMndzR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBDbGllbnQKLSAgICAgICAgICAgIGdlbmVyYXRlQ2xpZW50QnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oamF2YTJ3c0dyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBTZXJ2ZXIKLSAgICAgICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oamF2YTJ3c0dyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgICAgIC8vIEdlbiBXcmFwcGVyIGFuZCBGYXVsdCBCZWFuCi0gICAgICAgICAgICBnZW5lcmF0ZVdyYXBlckZhdWx0QmVhbnNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oCi0gICAgICAgICAgICAgICAgICAgIGphdmEyd3NHcm91cCwgbW9kZWwpOwotCi0gICAgICAgICAgICAvLyBHZW4gV1NETAotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKGphdmEyd3NHcm91cCwgbW9kZWwpOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlV1NETEdyb3VwKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgR3JvdXAgd3NkbEdyb3VwID0gbmV3IEdyb3VwKGphdmEyd3NHcm91cCA9PSBudWxsID8gY29tcG9zaXRlIDogamF2YTJ3c0dyb3VwLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbEdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotICAgICAgICB3c2RsR3JvdXAuc2V0TGF5b3V0KHdzZGxHcm91cExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExGaWxlTmFtZUxhYmVsKHdzZGxHcm91cCk7Ci0KLSAgICAgICAgd3NkbEZpbGVUZXh0ID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlV1NETEZpbGVOYW1lVGV4dCh3c2RsR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbCh3c2RsR3JvdXApOwotCi0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZ0NvbWJvKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMgPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKHdzZGxHcm91cCwgbW9kZWwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGVuYWJsZVdTRExHcm91cChtb2RlbC5pc0dlbmVyYXRlV1NETCgpKTsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlV1NETEdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHdzZGxGaWxlVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRXU0RMRmlsZU5hbWVTdGF0dXMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZ2V0V1NETEZpbGVOYW1lU3RhdHVzKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFdTRExfRklMRU5BTUVfT0tfU1RBVFVTOwotICAgICAgICBTdHJpbmcgd3NkbEZpbGVOYW1lID0gd3NkbEZpbGVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgaWYgKCFXU0RMVXRpbHMuaXNWYWxpZFdTRExGaWxlTmFtZSh3c2RsRmlsZU5hbWUpKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBXU0RMX0ZJTEVOQU1FX0VSUk9SX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ5ZDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLQotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTQ29uZmlnV2lkZ2V0IGphdmEyV1NDb25maWdXaWRnZXQgPSBuZXcgSmF2YTJXU0NvbmZpZ1dpZGdldCgpOwotCi0gICAgcHVibGljIEphdmEyV1NDb25maWdXaWRnZXRGYWN0b3J5KCkgewotCi0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBqYXZhMldTV2lkZ2V0Q29udHJpYnV0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldE5leHROYW1lZFdpZGdldChJTmFtZWRXaWRnZXRDb250cmlidXRvciB3aWRnZXRDb250cmlidXRvcikgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhKYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsCi0gICAgICAgICAgICAgICAgIkphdmEyV1NEYXRhTW9kZWwiLCBKYXZhMldTQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhMldTRGF0YU1vZGVsKEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgamF2YTJXU0NvbmZpZ1dpZGdldC5zZXRKYXZhMldTRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgamF2YTJXU1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIENYRkNvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB0aXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotCi0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfUEFHRV9ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpKSk7Ci0gICAgICAgIGphdmEyV1NXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBqYXZhMldTQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9KYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGE0ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkuQ1hGQ3JlYXRpb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuSmF2YTJXU1dpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgSVN0YXR1cyBJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTRGF0YU1vZGVsIG1vZGVsOwotICAgIHByaXZhdGUgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGU7Ci0KLSAgICBwcml2YXRlIENvbWJvIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm87Ci0gICAgCi0gICAgcHVibGljIEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAgICAgdGhpcy5zdGFydGluZ1BvaW50VHlwZSA9IHN0YXJ0aW5nUG9pbnRUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uTGFiZWwoY29tcG9zaXRlKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeQotICAgICAgICAgICAgLmNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oY29tcG9zaXRlLCBtb2RlbCwgc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgIAlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAJdmFsaWRhdGVJbXBsZW1lbnRhdGlvblNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgCi0gICAgICAgIEJ1dHRvbiBicm93c2VJbXBsQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlQnJvd3NlQnV0dG9uKGNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlSW1wbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIGJyb3dzZUltcGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKAotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlLmdldFNoZWxsKCksIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19USVRMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMX0RJQUxPR19ERVNDUklQVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IHNlbGVjdGlvbkRpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHVybkNvZGUgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgc2VsZWN0ZWRDb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uRGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZEltcGxlbWVudGF0aW9uID0gc2VsZWN0ZWRDb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbXBscyA9IEFycmF5cy5hc0xpc3Qoc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRJdGVtcygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBscy5jb250YWlucyhzZWxlY3RlZEltcGxlbWVudGF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAJc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGQoc2VsZWN0ZWRJbXBsZW1lbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkSW1wbGVtZW50YXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIElNUExfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlSW1wbGVtZW50YXRpb25TZWxlY3Rpb24oKSB7Ci0gICAgICAgIElUeXBlIGltcGxUeXBlID0gSkRUVXRpbHMuZmluZFR5cGUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpOwotICAgICAgICBpZiAoaW1wbFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kW10gc2VpTWV0aG9kcyA9IHN0YXJ0aW5nUG9pbnRUeXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZXRob2Qgc2VpTWV0aG9kIDogc2VpTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICBJTWV0aG9kW10gaW1wbE1ldGhvZCA9IGltcGxUeXBlLmZpbmRNZXRob2RzKHNlaU1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbXBsTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCUlNUExfU0VMRUNUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGQ3JlYXRpb25VSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIAkgICAgQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEltcGxlbWVudHNNZXNzYWdlKHN0YXJ0aW5nUG9pbnRUeXBlLCBzZWlNZXRob2QpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKHN0YXJ0aW5nUG9pbnRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFDbGFzc05hbWUoc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlJTVBMX1NFTEVDVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIENYRkNyZWF0aW9uVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAJICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XRUJTRVJWSUNFX0lNUExFTUVOVEFUSU9OX05PVF9GT1VORCwKLSAgICAgICAgICAgICAgICAgICAgCQlzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmdldFRleHQoKSkpOyAgIAotICAgICAgICB9ICAgICAgICAKLQl9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRJbXBsZW1lbnRzTWVzc2FnZShJVHlwZSBzZWlUeXBlLCBJTWV0aG9kIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcihzZWlUeXBlLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKHNlaU1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlcyA9IHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyVHlwZSA9IFNpZ25hdHVyZS50b1N0cmluZyhwYXJhbWV0ZXJUeXBlc1tpXSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChwYXJhbWV0ZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gbWVzc2FnZS50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL0phdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOThiZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLnVpLndpZGdldHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEphdmEyV1NTZWxlY3RTRUlXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EUE9JTlRfSU5URVJGQUNFID0gImVuZHBvaW50SW50ZXJmYWNlIjsKLQotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IgY2xhc3NXaWRnZXRDb250cmlidXRvcjsKLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yOwotCi0gICAgcHJpdmF0ZSBKYXZhMldTQ2xhc3NDb25maWdXaWRnZXQgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldCgpOwotICAgIHByaXZhdGUgSmF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldCBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0ID0gbmV3IEphdmEyV1NJbnRlcmZhY2VDb25maWdXaWRnZXQoKTsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RhdGFNb2RlbCBtb2RlbDsKLSAgICBwcml2YXRlIElUeXBlIHN0YXJ0aW5nUG9pbnRUeXBlOwotCi0gICAgcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvciA9PSBudWxsIHx8IGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZVdpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydGluZ1BvaW50VHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0ZvclNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc1dpZGdldENvbnRyaWJ1dG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZDcmVhdGlvblVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIElBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgaWYgKGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgSU1lbWJlclZhbHVlUGFpcltdIG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE1lbWJlck5hbWUoKS5lcXVhbHMoRU5EUE9JTlRfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBzdGFydGluZ1BvaW50VHlwZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWlUeXBlICE9IG51bGwgJiYgc2VpVHlwZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFVzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VOYW1lKGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kLmNsYXNzLAotICAgICAgICAgICAgICAgICJKYXZhMldTRGF0YU1vZGVsIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRhdGFSZWdpc3RyeS5hZGRNYXBwaW5nKEphdmEyV1NEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiSmF2YVN0YXJ0aW5nUG9pbnRUeXBlIiwgSmF2YTJXU1NlbGVjdFNFSVdpZGdldEZhY3RvcnkuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SmF2YTJXU0RhdGFNb2RlbChKYXZhMldTRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICAgICAgamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmEyV1NEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEphdmFTdGFydGluZ1BvaW50VHlwZShJVHlwZSBzdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICB0aGlzLnN0YXJ0aW5nUG9pbnRUeXBlID0gc3RhcnRpbmdQb2ludFR5cGU7Ci0gICAgICAgIGphdmEyV1NDbGFzc0NvbmZpZ1dpZGdldC5zZXRKYXZhU3RhcnRpbmdQb2ludFR5cGUoc3RhcnRpbmdQb2ludFR5cGUpOwotICAgICAgICBqYXZhMldTSW50ZXJmYWNlQ29uZmlnV2lkZ2V0LnNldEphdmFTdGFydGluZ1BvaW50VHlwZShzdGFydGluZ1BvaW50VHlwZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3IgPSBuZXcgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3IoKTsKLSAgICAgICAgQ1hGQ29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nIGNsYXNzQ29uZmlnVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9USVRMRSwKLSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Y29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKGNsYXNzQ29uZmlnVGl0bGUpOwotICAgICAgICBjbGFzc1dpZGdldENvbnRyaWJ1dG9yCi0gICAgICAgIC5zZXREZXNjcmlwdGlvbihDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19DTEFTU19DT05GSUdfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIGNsYXNzV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YTJXU0NsYXNzQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBTdHJpbmcgaW50ZXJmYWNlQ29uZmlnVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuSkFWQTJXU19JTlRFUkZBQ0VfQ09ORklHX1BBR0VfVElUTEUsCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde2NvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCksIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKCl9KTsKLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3Iuc2V0VGl0bGUoaW50ZXJmYWNlQ29uZmlnVGl0bGUpOwotICAgICAgICBpbnRlcmZhY2VXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLkpBVkEyV1NfSU5URVJGQUNFX0NPTkZJR19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgaW50ZXJmYWNlV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gamF2YTJXU0ludGVyZmFjZUNvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlOTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YUNvbmZpZ1dpZGdldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuV1NETDJKYXZhV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLlNpbXBsZVdpZGdldERhdGFDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXREYXRhRXZlbnRzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdTREwySmF2YUNvbmZpZ1dpZGdldCBleHRlbmRzIFNpbXBsZVdpZGdldERhdGFDb250cmlidXRvciB7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotICAgIHByaXZhdGUgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgQ29tYm8gb3V0cHV0RGlyQ29tYm87Ci0gICAgcHJpdmF0ZSBUZXh0IHBhY2thZ2VOYW1lVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uOwotICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgcGFja2FnZU5hbWVUYWJsZVZpZXdlcjsKLSAgICBwcml2YXRlIENvbWJvIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgcHJpdmF0ZSBMaXN0IGJpbmRpbmdGaWxlc0xpc3Q7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXI7Ci0gICAgcHJpdmF0ZSBDb21wb3NpdGUgbmFtZXNwYWNlQ29tcG9zaXRlOwotICAgIHByaXZhdGUgaW50IG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9IC0xOwotCi0gICAgcHVibGljIFdTREwySmF2YUNvbmZpZ1dpZGdldCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbGl6ZSgpIHsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG91dHB1dERpckNvbWJvLCBtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgZXhwYW5kTmFtZXNwYWNlQ29tcG9zaXRlKGZhbHNlKTsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIuc2V0SW5wdXQobW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5wb3B1bGF0ZVNlcnZpY2VOYW1lQ29tYm8oc2VydmljZU5hbWVDb21ibywgbW9kZWwpOwotCi0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3QucmVtb3ZlQWxsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpZGdldERhdGFFdmVudHMgYWRkQ29udHJvbHMoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgTGlzdGVuZXIgc3RhdHVzTGlzdGVuZXIpIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuc3RhdHVzTGlzdGVuZXIgPSBzdGF0dXNMaXN0ZW5lcjsKLQotICAgICAgICBmaW5hbCBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBPdXRwdXQgRGlyCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgb3V0cHV0RGlyQ29tYm8gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBvdXRwdXREaXJDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBQYWNrYWdlIE5hbWU6Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFja2FnZU5hbWVMYWJlbChtYWluQ29tcG9zaXRlKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVBhY2thZ2VOYW1lVGV4dChtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZVRleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEpEVFV0aWxzLnZhbGlkYXRlUGFja2FnZU5hbWUobW9kZWwuZ2V0UHJvamVjdE5hbWUoKSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIHN0YXR1c0xpc3RlbmVyLmhhbmRsZUV2ZW50KG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeQotICAgICAgICAuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24obWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUobmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlciA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGVIb2xkZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gU2VydmljZSBOYW1lOgotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21ibyA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlU2VydmljZU5hbWVDb21ibyhtYWluQ29tcG9zaXRlLCBtb2RlbCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBiaW5kaW5nRmlsZXNMYWJlbCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGFiZWwobWFpbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gMzsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYmluZGluZ0ZpbGVzTGlzdCA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQmluZGluZ0ZpbGVzTGlzdChtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDM7Ci0gICAgICAgIGJpbmRpbmdGaWxlc0xpc3Quc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgQnV0dG9uIGFkZEJpbmRpbmdGaWxlQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBZGRCaW5kaW5nRmlsZUJ1dHRvbihtYWluQ29tcG9zaXRlLCBtb2RlbCwKLSAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKG1haW5Db21wb3NpdGUsCi0gICAgICAgICAgICAgICAgbW9kZWwsIGJpbmRpbmdGaWxlc0xpc3QpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUGFkZGluZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0xhYmVsKG1haW5Db21wb3NpdGUpOwotCi0gICAgICAgIFRleHQgeG1sQ2F0YWxvZ1RleHQgPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhNTENhdGFsb2dUZXh0KG1haW5Db21wb3NpdGUsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihtYWluQ29tcG9zaXRlKTsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHBhbmROYW1lc3BhY2VDb21wb3NpdGUoYm9vbGVhbiBleHBhbmQpIHsKLSAgICAgICAgaWYgKGV4cGFuZCkgewotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICAgICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDc7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0KLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlcik7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBQb2ludCBncm91cFNpemUgPSBuYW1lc3BhY2VDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0ID0gZ3JvdXBTaXplLnk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2hlbGxTaXplID0gc2hlbGwuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgIHNoZWxsLnNldFNpemUoc2hlbGxTaXplLngsIHNoZWxsU2l6ZS55ICsgbmFtZXNwYWNlQ29tcG9zaXRlSGVpZ2h0KTsKLQotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuYW1lc3BhY2VDb21wb3NpdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlSG9sZGVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5wYWNrKCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VDb21wb3NpdGUgPSBudWxsOwotICAgICAgICAgICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZUhvbGRlci5sYXlvdXQoKTsKLSAgICAgICAgICAgICAgICBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsU2l6ZSA9IHNoZWxsLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICBzaGVsbC5zZXRTaXplKHNoZWxsU2l6ZS54LCBzaGVsbFNpemUueSAtIG5hbWVzcGFjZUNvbXBvc2l0ZUhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBnZXROYW1lc3BhY2VNYXBwaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgbmFtZXNwYWNlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIG5hbWVzcGFjZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gY3JlYXRlTmFtZXNwYWNlTWFwcGluZ1RhYmxlKG5hbWVzcGFjZUNvbXBvc2l0ZSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBuYW1lc3BhY2VDb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBUYWJsZSBjcmVhdGVOYW1lc3BhY2VNYXBwaW5nVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUgotICAgICAgICAgICAgICAgIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotICAgICAgICBUYWJsZSBwYWNrYWdlTmFtZVRhYmxlID0gcGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExOYW1lc3BhY2VWaWV3ZXJDb2x1bW4ocGFja2FnZU5hbWVUYWJsZVZpZXdlcik7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQYWNrYWdlTmFtZUNvbHVtbigKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLCBtb2RlbCk7Ci0KLSAgICAgICAgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3IgPSBuZXcgVGV4dENlbGxFZGl0b3IocGFja2FnZU5hbWVUYWJsZVZpZXdlci5nZXRUYWJsZSgpKTsKLSAgICAgICAgdGV4dENlbGxFZGl0b3IuYWRkTGlzdGVuZXIoIG5ldyBJQ2VsbEVkaXRvckxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBlZGl0b3JWYWx1ZUNoYW5nZWQoYm9vbGVhbiBvbGRWYWxpZFN0YXRlLCBib29sZWFuIG5ld1ZhbGlkU3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNMaXN0ZW5lci5oYW5kbGVFdmVudChudWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdG9yKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseUVkaXRvclZhbHVlKCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gSkRUVXRpbHMudmFsaWRhdGVQYWNrYWdlTmFtZShtb2RlbC5nZXRQcm9qZWN0TmFtZSgpLCBwYWNrYWdlTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldEVkaXRpbmdTdXBwb3J0KG5ldyBQYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0KHBhY2thZ2VOYW1lVGFibGVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgdGV4dENlbGxFZGl0b3IsIG1vZGVsKSk7Ci0KLSAgICAgICAgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcGFja2FnZU5hbWVUYWJsZVZpZXdlci5zZXRJbnB1dChtb2RlbC5nZXRXc2RsRGVmaW5pdGlvbigpKTsKLQotICAgICAgICBUYWJsZUl0ZW1bXSB0YWJsZUl0ZW1zID0gcGFja2FnZU5hbWVUYWJsZS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlSXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZUl0ZW1zW2ldOwotICAgICAgICAgICAgaWYgKG1vZGVsLmdldEluY2x1ZGVkTmFtZXNwYWNlcygpLmNvbnRhaW5zS2V5KHRhYmxlSXRlbS5nZXRUZXh0KDApKSkgewotICAgICAgICAgICAgICAgIHRhYmxlSXRlbS5zZXRDaGVja2VkKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVRhYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFDb25maWdXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDBiYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuZGF0YS5EYXRhTWFwcGluZ1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLklOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5TaW1wbGVXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5XaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIHByaXZhdGUgU2ltcGxlV2lkZ2V0Q29udHJpYnV0b3Igd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLQotICAgIHByaXZhdGUgV1NETDJKYXZhQ29uZmlnV2lkZ2V0IHdzZGwySmF2YUNvbmZpZ1dpZGdldCA9IG5ldyBXU0RMMkphdmFDb25maWdXaWRnZXQoKTsKLSAgICBwcml2YXRlIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0IHdzZGwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0ID0gbmV3IFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0KCk7Ci0KLSAgICBwdWJsaWMgSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3IgZ2V0Rmlyc3ROYW1lZFdpZGdldCgpIHsKLSAgICAgICAgaWYgKHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yID09IG51bGwgfHwgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLSAgICAgICAgaWYgKHdpZGdldENvbnRyaWJ1dG9yID09IHdzZGwySmF2YVdpZGdldENvbnRyaWJ1dG9yKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhdGFNYXBwaW5ncyhEYXRhTWFwcGluZ1JlZ2lzdHJ5IGRhdGFSZWdpc3RyeSkgewotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywKLSAgICAgICAgICAgICAgICAiV1NETDJKYXZhRGF0YU1vZGVsIiwgV1NETDJKYXZhQ29uZmlnV2lkZ2V0RmFjdG9yeS5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU0RMMkphdmFEYXRhTW9kZWwoV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHdzZGwySmF2YUNvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldC5zZXRXU0RMMkphdmFEYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvciA9IG5ldyBTaW1wbGVXaWRnZXRDb250cmlidXRvcigpOwotICAgICAgICBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFQYWdlVGl0bGUgPSBDWEZDcmVhdGlvblVJTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICBDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX1BBR0VfVElUTEUsIG5ldyBPYmplY3RbXXtjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvci5zZXRUaXRsZSh3c2RsMkphdmFQYWdlVGl0bGUpOwotICAgICAgICB3c2RsMkphdmFXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLmJpbmQoQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9QQUdFX0RFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgd3NkbDJKYXZhV2lkZ2V0Q29udHJpYnV0b3Iuc2V0RmFjdG9yeShuZXcgV2lkZ2V0Q29udHJpYnV0b3JGYWN0b3J5KCkgewotICAgICAgICAgICAgcHVibGljIFdpZGdldENvbnRyaWJ1dG9yIGNyZWF0ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3NkbDJKYXZhQ29uZmlnV2lkZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yID0gbmV3IFNpbXBsZVdpZGdldENvbnRyaWJ1dG9yKCk7Ci0gICAgICAgIFN0cmluZyB3c2RsMkphdmFEZWZhdWx0c1BhZ2VUaXRsZSA9IENYRkNyZWF0aW9uVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfREVGQVVMVFNfUEFHRV9USVRMRSwgbmV3IE9iamVjdFtdewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSwgY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKX0pOwotICAgICAgICB3c2RsMkphdmFEZWZhdWx0c1dpZGdldENvbnRyaWJ1dG9yLnNldFRpdGxlKHdzZGwySmF2YURlZmF1bHRzUGFnZVRpdGxlKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvcgotICAgICAgICAuc2V0RGVzY3JpcHRpb24oQ1hGQ3JlYXRpb25VSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUU19QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgd3NkbDJKYXZhRGVmYXVsdHNXaWRnZXRDb250cmlidXRvci5zZXRGYWN0b3J5KG5ldyBXaWRnZXRDb250cmlidXRvckZhY3RvcnkoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgV2lkZ2V0Q29udHJpYnV0b3IgY3JlYXRlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB3c2RsMkphdmFEZWZhdWx0c0NvbmZpZ1dpZGdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93aWRnZXRzL1dTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2JlYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24udWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS5DWEZDcmVhdGlvblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLldTREwySmF2YVdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LnVpLndpZGdldHMuU2ltcGxlV2lkZ2V0RGF0YUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi51aS53aWRnZXRzLldpZGdldERhdGFFdmVudHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhRGVmYXVsdHNDb25maWdXaWRnZXQgZXh0ZW5kcyBTaW1wbGVXaWRnZXREYXRhQ29udHJpYnV0b3IgewotICAgIHByaXZhdGUgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsOwotCi0gICAgcHVibGljIFdTREwySmF2YURlZmF1bHRzQ29uZmlnV2lkZ2V0KCkgewotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdTREwySmF2YURhdGFNb2RlbChXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaWRnZXREYXRhRXZlbnRzIGFkZENvbnRyb2xzKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIExpc3RlbmVyIHN0YXR1c0xpc3RlbmVyKSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRkNyZWF0aW9uVUlNZXNzYWdlcy5XU0RMMkpBVkFfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwyamF2YWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRMYXlvdXQod3NkbDJqYXZhbGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVQcm9jZXNzU09BUEhlYWRlcnNCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIG1vZGVsKTsKLQotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpKSB7Ci0gICAgICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbih3c2RsMmphdmFHcm91cCwgbW9kZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1vZGVsLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBtb2RlbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBHcm91cCB4amNBcmdHcm91cCA9IG5ldyBHcm91cChtYWluQ29tcG9zaXRlLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0VGV4dChDWEZDcmVhdGlvblVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfTEFCRUwpOwotICAgICAgICBHcmlkTGF5b3V0IHhqY0FyZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXQoeGpjQXJnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIHhqY0FyZ3NUYWJsZSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDQXJnVGFibGUoeGpjQXJnR3JvdXAsIG1vZGVsKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2OwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgbW9kZWwpOwotICAgICAgICBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDU3luY01ldGhvZHNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBtb2RlbCk7Ci0gICAgICAgIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDTWFya0dlbmVyYXRlZFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIG1vZGVsKTsKLQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dpZGdldHMvV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3YzA0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd2lkZ2V0cy9XU0RMMkphdmFQcm9qZWN0U2VsZWN0aW9uV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLndpZGdldHMuZXh0ZW5zaW9ucy5TZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkud2lkZ2V0cy5TZXJ2ZXJXaXphcmRXaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi5jb3JlLmNvbW1hbmRzLldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYudWkud2lkZ2V0cy5JTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyBzdG9wIGdhcCB3b3JrYXJvdW5kIGZvciBidWdzIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNDMyODYiPiMyNDMyODY8L2E+Ci0gKiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI0MzI5MCI+IzI0MzI5MDwvYT4KLSAqIDxwPgotICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDxjb2RlPldTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kPC9jb2RlPgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbldpZGdldEZhY3RvcnkgaW1wbGVtZW50cyBJTmFtZWRXaWRnZXRDb250cmlidXRvckZhY3RvcnkgewotCi0JcHVibGljIElOYW1lZFdpZGdldENvbnRyaWJ1dG9yIGdldEZpcnN0TmFtZWRXaWRnZXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTmFtZWRXaWRnZXRDb250cmlidXRvciBnZXROZXh0TmFtZWRXaWRnZXQoSU5hbWVkV2lkZ2V0Q29udHJpYnV0b3Igd2lkZ2V0Q29udHJpYnV0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLQkJZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0RGVmYXVsdGluZ0NvbW1hbmQuY2xhc3MsICJJbml0aWFsUHJvamVjdCIsICAvLyROT04tTkxTLTEkCi0JCQkJV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQuY2xhc3MpOwotCSAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhTZXJ2ZXJFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5jbGFzcywgIlNlcnZlclByb2plY3QiLCAgLy8kTk9OLU5MUy0xJAotCSAgICAJCVdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzLCAiU2VydmVyUHJvamVjdCIsIG5ldyBTdHJpbmdUb0lQcm9qZWN0VHJhbnNmb3JtZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoU2VydmVyV2l6YXJkV2lkZ2V0LmNsYXNzLCAiUHJvamVjdCIsIFdTREwySmF2YVByb2plY3RTZWxlY3Rpb25Db21tYW5kLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi9jcmVhdGlvbi91aS93c3J0L0NYRldlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5MzhiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkphdmEyV1NEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuQ1hGRGVwbG95Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSkFYV1NBbm5vdGF0ZUphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5KYXZhMldTU2VsZWN0U0VJQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY3JlYXRpb24uY29yZS5jb21tYW5kcy5XU0RMMkphdmFEZWZhdWx0aW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNyZWF0aW9uLmNvcmUuY29tbWFuZHMuV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuaW50ZXJuYWwuZW52LmNvcmUuSUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLlNpbXBsZUNvbW1hbmRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb3JlLmRhdGEuRGF0YU1hcHBpbmdSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5pbnRlcm5hbC5lbnYuZWNsaXBzZS5FY2xpcHNlRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudC5JRW52aXJvbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC53c3J0LklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuV2ViU2VydmljZVNjZW5hcmlvOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENYRldlYlNlcnZpY2UgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2UgewotCi0gICAgcHVibGljIENYRldlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykgewotICAgICAgICBzdXBlcihpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGFzc2VtYmxlKElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGVwbG95KElFbnZpcm9ubWVudCBlbnZpcm9ubWVudCwgSUNvbnRleHQgY3R4LCBJU2VsZWN0aW9uIHNlbGVjdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBJQ29tbWFuZEZhY3RvcnkgZGV2ZWxvcChJRW52aXJvbm1lbnQgZW52aXJvbm1lbnQsIElDb250ZXh0IGN0eCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0gICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBlYXJQcm9qZWN0KSB7Ci0gICAgICAgIFZlY3RvciBjb21tYW5kcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBFY2xpcHNlRW52aXJvbm1lbnQgZWNsaXBzZUVudmlyb25tZW50ID0gKEVjbGlwc2VFbnZpcm9ubWVudCkgZW52aXJvbm1lbnQ7Ci0gICAgICAgIHJlZ2lzdGVyRGF0YU1hcHBpbmdzKGVjbGlwc2VFbnZpcm9ubWVudC5nZXRDb21tYW5kTWFuYWdlcigpLmdldE1hcHBpbmdSZWdpc3RyeSgpKTsKLQotICAgICAgICBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uQk9UVE9NVVApIHsKLSAgICAgICAgICAgIEphdmEyV1NEYXRhTW9kZWwgamF2YTJXU0RhdGFNb2RlbCA9IENYRkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmEyV1NEYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGphdmEyV1NEYXRhTW9kZWwuc2V0UHJvamVjdE5hbWUocHJvamVjdE5hbWUpOwotICAgICAgICAgICAgamF2YTJXU0RhdGFNb2RlbC5zZXRKYXZhU3RhcnRpbmdQb2ludCh0aGlzLmdldFdlYlNlcnZpY2VJbmZvKCkuZ2V0SW1wbFVSTCgpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU1ZhbGlkYXRlSW5wdXRDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU0RlZmF1bHRpbmdDb21tYW5kKGphdmEyV1NEYXRhTW9kZWwpKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgSmF2YTJXU1NlbGVjdFNFSUNvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKQVhXU0Fubm90YXRlSmF2YUNvbW1hbmQoamF2YTJXU0RhdGFNb2RlbCkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBKYXZhMldTQ29tbWFuZChqYXZhMldTRGF0YU1vZGVsKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3R4LmdldFNjZW5hcmlvKCkuZ2V0VmFsdWUoKSA9PSBXZWJTZXJ2aWNlU2NlbmFyaW8uVE9QRE9XTikgewotICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIHdzZGwySmF2YURhdGFNb2RlbCA9IENYRkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTREwySmF2YURhdGFNb2RlbCgpOwotICAgICAgICAgICAgd3NkbDJKYXZhRGF0YU1vZGVsLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICAgICAgICAgIGNvbW1hbmRzLmFkZChuZXcgV1NETDJKYXZhUHJvamVjdFNlbGVjdGlvbkNvbW1hbmQod3NkbDJKYXZhRGF0YU1vZGVsKSk7Ci0gICAgICAgICAgICBjb21tYW5kcy5hZGQobmV3IFdTREwySmF2YURlZmF1bHRpbmdDb21tYW5kKHdzZGwySmF2YURhdGFNb2RlbCwgcHJvamVjdE5hbWUsIAotICAgICAgICAgICAgCQlnZXRXZWJTZXJ2aWNlSW5mbygpLmdldFdzZGxVUkwoKSkpOwotICAgICAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBXU0RMMkphdmFDb21tYW5kKHdzZGwySmF2YURhdGFNb2RlbCwgdGhpcykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbW1hbmRGYWN0b3J5KGNvbW1hbmRzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEYXRhTWFwcGluZ3MoRGF0YU1hcHBpbmdSZWdpc3RyeSBkYXRhUmVnaXN0cnkpIHsKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoSmF2YTJXU0NvbW1hbmQuY2xhc3MsICJDWEZEYXRhTW9kZWwiLCBDWEZEZXBsb3lDb21tYW5kLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkYXRhUmVnaXN0cnkuYWRkTWFwcGluZyhXU0RMMkphdmFDb21tYW5kLmNsYXNzLCAiQ1hGRGF0YU1vZGVsIiwgQ1hGRGVwbG95Q29tbWFuZC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgZGF0YVJlZ2lzdHJ5LmFkZE1hcHBpbmcoQ1hGRGVwbG95Q29tbWFuZC5jbGFzcywgIkNsaWVudENvbXBvbmVudFR5cGUiLCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIENsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbW1hbmRGYWN0b3J5IGluc3RhbGwoSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCAKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIElDb21tYW5kRmFjdG9yeSBydW4oSUVudmlyb25tZW50IGVudmlyb25tZW50LCBJQ29udGV4dCBjdHgsIElTZWxlY3Rpb24gc2VsZWN0aW9uLCAKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhclByb2plY3QpIHsKLSAgICAgICAgVmVjdG9yIGNvbW1hbmRzID0gbmV3IFZlY3RvcigpOwotICAgICAgICBjb21tYW5kcy5hZGQobmV3IENYRkRlcGxveUNvbW1hbmQocHJvamVjdE5hbWUsIHRoaXMpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVDb21tYW5kRmFjdG9yeShjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdlYlNlcnZpY2VJbmZvIGdldFdlYlNlcnZpY2VJbmZvKCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0V2ViU2VydmljZUluZm8oKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlUnVudGltZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL2NyZWF0aW9uL3VpL3dzcnQvQ1hGV2ViU2VydmljZVJ1bnRpbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4YzY4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuY3JlYXRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvY3JlYXRpb24vdWkvd3NydC9DWEZXZWJTZXJ2aWNlUnVudGltZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jcmVhdGlvbi51aS53c3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb25zdW1wdGlvbi51aS53c3J0LkNYRldlYlNlcnZpY2VDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLndzcnQuQWJzdHJhY3RXZWJTZXJ2aWNlUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5JV2ViU2VydmljZUNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlQ2xpZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwud3NydC5XZWJTZXJ2aWNlSW5mbzsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDWEZXZWJTZXJ2aWNlUnVudGltZSBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVJ1bnRpbWUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXZWJTZXJ2aWNlIGdldFdlYlNlcnZpY2UoV2ViU2VydmljZUluZm8gaW5mbykgewotICAgICAgICByZXR1cm4gbmV3IENYRldlYlNlcnZpY2UoaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXZWJTZXJ2aWNlQ2xpZW50IGdldFdlYlNlcnZpY2VDbGllbnQoV2ViU2VydmljZUNsaWVudEluZm8gaW5mbykgewotICAgICAgICByZXR1cm4gbmV3IENYRldlYlNlcnZpY2VDbGllbnQoaW5mbyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMWQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAzNDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYWRkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI0ZyaSBOb3YgMDcgMjM6NTg6NTUgRVNUIDIwMDgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTg5MjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWksb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNC4zIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbWFuZC5lbnY7YnVuZGxlLXZlcnNpb249IlsxLjAuMzA1LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1hbmQuZW52LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMjA0LDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwxLjUuMCkiCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1DcmVhdGVkLUJ5OiAxLjUuMF8xNC1iMDMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDE2OWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAxMiwgMjAwODwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjdjNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy9vYmoxNi9saWJyYXJ5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL29iajE2L2xpYnJhcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9pY29ucy93aXpiYW4vbGlicmFyeV93aXoucG5nIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNWRjMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL2ljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWM2YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9Q1hGIFdlYiBTZXJ2aWNlcyBVSSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLVBSRUZFUkVOQ0VfQ0FURUdPUllfQ1hGX1JVTlRJTUU9Q1hGIDIueCBQcmVmZXJlbmNlcwotUFJPUEVSVElFU19DQVRFR09SWV9DWEZfUlVOVElNRT1DWEYgMi54IFNldHRpbmdzCi0KLUNYRl9SVU5USU1FX05BTUU9Q1hGIFJ1bnRpbWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjIyMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5uYW1lIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkucHJlZmVyZW5jZXMuQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIKLSAgICAgICAgIG5hbWU9IiVQUkVGRVJFTkNFX0NBVEVHT1JZX0NYRl9SVU5USU1FIj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8IS0tPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgbmFtZT0iJVBST1BFUlRJRVNfQ0FURUdPUllfQ1hGX1JVTlRJTUUiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcm9wZXJ0aWVzLkNYRlByb3BlcnR5UGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnByb3BlcnR5UGFnZXMuQ1hGUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0iY3hmLmNvcmUiIC8+Ci0gICAgICAgICAgICA8L2FkYXB0PiAgICAgICAgIAotICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIj4KLSAgICAgIDx3aXphcmQtcGFnZXMgYWN0aW9uPSJjeGYuY29yZS5pbnN0YWxsIj4KLSAgICAgICAgIDxwYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzLkNYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UiPgotICAgICAgICAgPC9wYWdlPgotICAgICAgPC93aXphcmQtcGFnZXM+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmNsYXNzcGF0aENvbnRhaW5lclBhZ2UiPgotICAgICAgPGNsYXNzcGF0aENvbnRhaW5lclBhZ2UKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNvcmUuQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIiCi0gICAgICAgICBuYW1lPSIlQ1hGX1JVTlRJTUVfTkFNRSI+Ci0gICAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5NjQ3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1hGVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUltZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9BRERfQlVUVE9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FRElUX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNJT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9UWVBFX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0RFU0NSSVBUSU9OX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfVFlQRV9DT0xVTU5fTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9FTlRFUl9UWVBFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0lOVkFMSURfVFlQRV9OQU1FOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1hGX1BST1BFUlRZX1BBR0VfUlVOVElNRV9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9BRERfV0lORE9XX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlNUQUxMX1dJWkFSRF9FRElUX1dJTkRPV19USVRMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9GQUNFVF9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU0RMX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNQUklOR19DT05GSUdfUFJFRkVSRU5DRVNfVEFCX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDWEZfREVGQVVMVF9EQVRBQklORElOR19MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NETF9HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9JTVBMRU1FTlRBVElPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1dTRExfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9JTlZBTElEX1ZFUlNJT05fRk9STUFUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENYRl9WRVJTSU9OX05PVF9TUEVDSUZJRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BST0NFU1NfU09BUF9IRUFERVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTUFQUElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfRVhDTFVERVNfTkFNRVNQQUNFX01BUFBJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1dTRExfVkVSU0lPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9XRUJfTUVUSE9EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19HRU5FUkFURV9SRVFVRVNUX1dSQVBQRVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfQ1JFQVRFX1hTRF9JTVBPUlRTX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRlJPTlRFTkRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dTRExfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CRUFOU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfVEFSR0VUX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VSVklDRV9OQU1FX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0FERFJFU1NfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfV1NETF9GSUxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19PVVRQVVRfRklMRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19VU0VfU0VJX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19CUk9XU0VfTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19FWFRSQUNUX1NFSTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfRVhUUkFDVF9TRUlfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19ERVNFTEVDVF9BTExfQlVUVE9OOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9GUk9OVEVORF9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9EQVRBQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9XU0RMX1ZFUlNJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfSU1QTEVNRU5UQVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfR0VORVJBVEVfQ0xJRU5UX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9MT0NBVElPTl9UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX05PX0FERFJFU1NfQklORElOR19UT09MVElQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQVVUT19OQU1FX1JFU09MVVRJT05fVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0FSR19DT0xVTU5fTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0RFU0NSSVBUSU9OX0NPTFVNTl9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19UT1NUUklORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX01VTFRJTElORTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX1RPU1RSSU5HX1NJTVBMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0xPQ0FUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19TWU5DX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfWEpDX0VQSVNPREVfRklMRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9QQUNLQUdFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX0ZJTEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFU19BREQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19GSUxURVJfTkFNRTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdTREwySkFWQV9YTUxfQ0FUTE9HX1RPT0xUSVA7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIENYRlVJTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ1hGVUlNZXNzYWdlcygpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyMjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9DWEZVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENYRlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLSAgICAvLyBUaGUgcGx1Zy1pbiBJRAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotICAgIHByaXZhdGUgc3RhdGljIENYRlVJUGx1Z2luIHBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDWEZVSVBsdWdpbigpIHsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgICAgICBwbHVnaW4gPSB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHBsdWdpbiA9IG51bGw7Ci0gICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDWEZVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gcGx1Z2luOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAKLSAgICAgICAgICAgIGV4Y2VwdGlvbi50b1N0cmluZygpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL0NYRlVJbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1NzYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvQ1hGVUltZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jQ1hGIFByZWZlcmVuY2UgUGFnZXMKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUU9JkNYRiBSdW50aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQPUJyb3dzZSBhbmQgc2VsZWN0IENYRiBCaW5hcnkgZGlzdHJpYnV0aW9uIGZvbGRlcgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTD1DWEYgJmhvbWU6Ci1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUPU1pc3NpbmcgQ1hGIGphcjogUGxlYXNlIHNlbGVjdCB0aGUgQ1hGIGhvbWUgZGlyZWN0b3J5LgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUw9JkFkZC4uLgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMPSZFZGl0Li4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTD0mUmVtb3ZlCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQlJPV1NFX0JVVFRPTl9MQUJFTD0mQnJvd3NlLi4uCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNJT05fTEFCRUw9VmVyc2lvbjoKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVFlQRV9MQUJFTD1UeXBlOgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUj1FeHBvcnQgcnVudGltZSBsaWJyYXJpZXMgdG8gV0VCLUlORi9saWIgYXQgZGVwbG95bWVudCB0aW1lCi1DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfREVTQ1JJUFRJT05fTEFCRUw9QWRkLCByZW1vdmUgb3IgZWRpdCBDWEYgcnVudGltZXMuIEJ5IGRlZmF1bHQsIHRoZSBjaGVja2VkIENYRiBydW50aW1lIGlzIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIG9mIGEgcHJvamVjdCB3aGVuIGluc3RhbGxpbmcgdGhlIENYRiBmYWNldC4KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FPVZlcnNpb24KLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRT1Mb2NhdGlvbgotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1RZUEVfQ09MVU1OX05BTUU9VHlwZQotQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VOVEVSX1RZUEVfTkFNRT1FbnRlciB0eXBlIG5hbWUKLUNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9JTlZBTElEX1RZUEVfTkFNRT1JbnZhbGlkIHR5cGUgbmFtZTogezB9Ci1DWEZfUFJPUEVSVFlfUEFHRV9SVU5USU1FX0xBQkVMPUNYRiBydW50aW1lOgotQ1hGX0NPTkZJR1VSRV9JTlNUQUxMRURfUlVOVElNRVNfTEFCRUw9PEE+Q29uZmlndXJlIGluc3RhbGxlZCBydW50aW1lczwvQT4KLQotQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIFJ1bnRpbWUKLUNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OPVNwZWNpZnkgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBDWEYgcnVudGltZS4KLUNYRl9JTlNUQUxMX1dJWkFSRF9BRERfV0lORE9XX1RJVExFPUFkZCBDWEYgUnVudGltZQotQ1hGX0lOU1RBTExfV0laQVJEX0VESVRfV0lORE9XX1RJVExFPUVkaXQgQ1hGIFJ1bnRpbWUKLQotQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEU9Q1hGIEZhY2V0Ci1DWEZfRkFDRVRfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTj1Db25maWd1cmUgdGhlIENYRiBmYWNldCBzZXR0aW5ncy4KLSAgICAKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfTkFNRT1KYXZhMldTREwKLUpBVkEyV1NETF9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXU0RMIHRvb2wKLQotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfTkFNRT0mSmF2YTJXUwotSkFWQTJXU19QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgSmF2YTJXUyB0b29sCi0KLUFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTks9U2VlIHRoZSA8QT4nSkFYLVdTJzwvQT4gdGFiIGZvciB0aGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy4KLQotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX05BTUU9SkEmWC1XUwotQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVA9UGxlYXNlIHNlbGVjdCB0aGUgSkFYLVdTIGFubm90YXRpb25zIHRoYXQgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IG9uIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgYmVmb3JlIGlucHV0IHRvIEphdmEyV1MKLQotV1NETDJKQVZBX1BSRUZFUkVOQ0VTX1RBQl9OQU1FPSZXU0RMMkphdmEKLVdTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfVE9PTFRJUD1QbGVhc2Ugc2VsZWN0IHRoZSBkZWZhdWx0IHByZWZlcmVuY2VzIGZvciB0aGUgV1NETDJKYXZhIHRvb2wKLQotU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfTkFNRT0mRW5kcG9pbnQgQ29uZmlnCi1TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQPVBsZWFzZSBzZWxlY3QgdGhlIGRlZmF1bHQgb3B0aW9uIGZvciBTcHJpbmcgY29uZmlndXJhdGlvbiBnZW5lcmF0aW9uCi1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU0VSVkxFVD1Vc2UgQ1gmRiBTZXJ2bGV0Ci1TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQ9VXNlIFNwcmluZyAmQXBwbGljYXRpb24gQ29udGV4dAotCi1DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTD1EZWZhdWx0ICZGcm9udGVuZDoKLUNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMPURlZmF1bHQgJkRhdGFiaW5kbmc6Ci1KQVZBMldTX0dST1VQX0xBQkVMPUphdmEyV1MgR2VuZXJhdGlvbiBPcHRpb25zOgotSkFWQTJXU0RMX0dST1VQX0xBQkVMPUphdmEyV1NETCBHZW5lcmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfR1JPVVBfTEFCRUw9V1NETDJKYXZhIEdlbmVyYXRpb24gT3B0aW9uczoKLUpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTD1HZW5lcmF0ZSBDbGkmZW50Ci1KQVZBMldTX0dFTl9TRVJWRVJfTEFCRUw9R2VuZXJhdGUgU2VyJnZlcgotSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUw9R2VuZXJhdGUgJkltcGxlbWVudGF0aW9uCi1KQVZBMldTX0dFTl9XUkFQUEVSX0ZBVUxUX0xBQkVMPUdlbmVyYXRlIFdyYXBwZXIgYW5kIEZhdWx0ICZCZWFucwotSkFWQTJXU19HRU5fV1NETF9MQUJFTD1HZW5lcmF0ZSBXU0QmTAotSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMPURlZmF1bHQgUyZPQVAgQmluZGluZzoKLUpBVkEyV1NfR0VOX1hTRF9JTVBPUlRTPUdlbmVyYXRlIHNlcGFyYXRlIFhTRCBmb3IgdGhlICZ0eXBlcwotQ1hGX0lOVkFMSURfVkVSU0lPTl9GT1JNQVQ9SW52YWxpZCBWZXJzaW9uIEZvcm1hdAotQ1hGX1ZFUlNJT05fTk9UX1NQRUNJRklFRD1DWEYgdmVyc2lvbiB2YWx1ZSBub3Qgc3BlY2lmaWVkCi1TUFJJTkdfQ09ORklHX0dST1VQX0xBQkVMPUNYRiBFbmRwb2ludCBDb25maWd1cmF0aW9uIE9wdGlvbnM6Ci1XU0RMMkpBVkFfUFJPQ0VTU19TT0FQX0hFQURFUlM9RW5hYmxlICZwcm9jZXNzaW5nIG9mIGltcGxpY2l0IFNPQVAgaGVhZGVycwotV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HPUVuYWJsZSAmbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmcKLVdTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORz1FbmFibGUgdGhlIHVzZSBvZiB0aGUgZGVmYXVsdCAmZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLVdTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUw9V1NETCBWZXJzaW9uOgotV1NETDJKQVZBX1VTRV9ERUZBVUxUX1ZBTFVFUz1HZW5lcmF0ZSAmZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzCi0KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIEdlbmVyYXRpb24KLUpBWFdTX0FOTk9UQVRJT05TX0dST1VQX1RPT0xUSVA9U2VsZWN0IHRoZSBhbm5vdGF0aW9ucyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgb24gdGhlIGNsYXNzIG9yIGludGVyZmFjZSBiZWZvcmUgaW5wdXQgdG8gSmF2YTJXUwotSkFYV1NfR0VORVJBVEVfV0VCX01FVEhPRD1AV2ViJk1ldGhvZAotSkFYV1NfR0VORVJBVEVfV0VCX1BBUkFNPUBXZWImUGFyYW0KLUpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUj1AUmUmcXVlc3RXcmFwcGVyCi1KQVhXU19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSPUAmUmVzcG9uc2VXcmFwcGVyCi1KQVhXU19BTk5PVEFUSU9OU19QUk9DRVNTSU5HX0dST1VQX0xBQkVMPUpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3NpbmcKLUpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkc9JkVuYWJsZSBhbm5vdGF0aW9uIHZhbGlkYXRpb24gcHJvY2Vzc2luZwotSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQPVR1cm4gSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc2luZyBvbiBvciBvZmYgaW4gcHJvamVjdHMgY29uZmlndXJlZCBmb3IgezB9IHdlYiBzZXJ2aWNlcwotICAgIAotSkFWQTJXU19TT0FQMTJfQklORElOR19UT09MVElQPVNwZWNpZnkgdG8gZ2VuZXJhdGUgU09BUCAxLjIgYmluZGluZwotSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUD0gT3V0cHV0IHNjaGVtYXMgdG8gc2VwYXJhdGUgZmlsZXMgYW5kIHVzZSBpbXBvcnRzIHRvIGxvYWQgdGhlbSBpbnN0ZWFkIG9mIGlubGluaW5nIHRoZW0gaW50byB0aGUgd3NkbAotSkFWQTJXU19EQVRBQklORElOR19UT09MVElQPSBTcGVjaWZ5IHRoZSBkYXRhIGJpbmRpbmcuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQKLSNKQVZBMldTX0RBVEFCSU5ESU5HX1RPT0xUSVA9IFNwZWNpZnkgdGhlIGRhdGEgYmluZGluZyAoYWVnaXMgb3IgamF4YikuIERlZmF1bHQgaXMgamF4YiBmb3IgamF4d3MgZnJvbnRlbmQsIGFuZCBhZWdpcyBmb3Igc2ltcGxlIGZyb250ZW5kCi1KQVZBMldTX0ZST05URU5EX1RPT0xUSVA9U3BlY2lmeSB0aGUgZnJvbnRlbmQgdG8gdXNlCi0jSkFWQTJXU19GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kIHRvIHVzZS4gamF4d3MgYW5kIHRoZSBzaW1wbGUgZnJvbnRlbmQgYXJlIHN1cHBvcnRlZAotSkFWQTJXU19HRU5FUkFURV9XU0RMX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgV1NETCBmaWxlCi1KQVZBMldTX0dFTkVSQVRFX1dSQVBQRVJCRUFOX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSB0aGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbgotSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUD1HZW5lcmF0ZSBhIGNsaWVudCBtYWlubGluZSB1c2luZyBKQVgtV1MgQVBJc1xuLi4uLi5cbiBqYXZheC54bWwud3MuU2VydmljZSBzZXJ2aWNlID0gamF2YXgueG1sLndzLlNlcnZpY2UuY3JlYXRlKC4uLik7XG4uLi4gY2xpZW50ID0gc2VydmljZS5nZXRQb3J0KC4uLik7XG4KLUpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVA9R2VuZXJhdGUgYSBzZXJ2ZXIgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXNcbi4uLi4uXG4gamF2YXgueG1sLndzLkVuZHBvaW50LnB1Ymxpc2goLi4uKTtcbi4uLi4uXG4KLUpBVkEyV1NfR0VORVJBVEVfQU5UX1RPT0xUSVA9U3BlY2lmeSB0byBnZW5lcmF0ZSBhbiBBbnQgYnVpbGQueG1sIGZpbGUKLUpBVkEyV1NfQkVBTlNfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwYXRobmFtZSBvZiBhIGZpbGUgZGVmaW5pbmcgYWRkaXRpb25hbCBTcHJpbmcgYmVhbnMgdG8gY3VzdG9taXNlIGRhdGEgYmluZGluZyBjb25maWd1cmF0aW9uCi1KQVZBMldTX1RBUkdFVF9OQU1FU1BBQ0VfVE9PTFRJUD1TcGVjaWZ5IHRoZSB0YXJnZXQgbmFtZXNwYWNlIHRvIHVzZSBpbiB0aGUgd3NkbAotSkFWQTJXU19TRVJWSUNFX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBzZXJ2aWNlIG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19QT1JUX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHRoZSBwb3J0IG5hbWUgdG8gdXNlIGluIHRoZSBnZW5lcmF0ZWQgd3NkbAotSkFWQTJXU19BRERSRVNTX1RPT0xUSVA9IFNwZWNpZnkgdGhlIHBvcnQgYWRkcmVzcwotCi1KQVZBMldTX1dTRExfRklMRV9OQU1FPSZXU0RMIEZpbGU6Ci1KQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVA9U3BlY2lmeSB0aGUgb3V0cHV0IHdzZGwgZmlsZSBuYW1lCi0KLUpBVkEyV1NfVVNFX1NFSV9CVVRUT049JlVzZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlOgotSkFWQTJXU19VU0VfU0VJX0lORk9fTEFCRUw9KFlvdSBtYXkgd29yayBkaXJlY3RseSB3aXRoIHRoZSB7MH0gSmF2YSBjbGFzcy4gQnV0IHdvcmtpbmcgZnJvbSBhbiBpbnRlcmZhY2UgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoLiBUd28gb3B0aW9ucyBhcmUgcHJvdmlkZWQgaGVyZS4pCi1KQVZBMldTX1NFTEVDVF9TRUk9U2VsZWN0IFNFSToKLSNKQVZBMldTX1NFTEVDVF9TRUlfTEFCRUw9U2VsZWN0IFNFSSBmcm9tICZUeXBlIEhpZXJhcmNoeToKLUpBVkEyV1NfU0VMRUNUX1NFSV9MQUJFTD1TZWxlYyZ0IGFuIFNFSToKLUpBVkEyV1NfU0VMRUNUX1NFSV9UT09MVElQPVNlbGVjdCB0aGUgSW50ZXJmYWNlIGZyb20gdGhlIFR5cGUgSGllcmFyY2h5IHRvIHVzZSBhcyB0aGUgU0VJCi1KQVZBMldTX0JST1dTRV9MQUJFTD1Ccm93c2UuLi4KLUpBVkEyV1NfRVhUUkFDVF9TRUk9RXh0cmFjdCBTRUk6Ci1KQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMPSZDcmVhdGUgYW4gU0VJOgotSkFWQTJXU19FWFRSQUNUX1NFSV9UT09MVElQPVR5cGUgdGhlIG5hbWUgb2YgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHRvIGV4dHJhY3QKLUpBVkEyV1NfRVhUUkFDVF9NRU1CRVJTX0xBQkVMPU1lbWJlcnMgdG8gZGVjbGFyZSBpbiB0aGUgZXh0cmFjdGVkIFNFSToKLUpBVkEyV1NfU0VMRUNUX0FMTF9CVVRUT049JlNlbGVjdCBBbGwuLi4KLUpBVkEyV1NfREVTRUxFQ1RfQUxMX0JVVFRPTj0mRGVzZWxlY3QgQWxsLi4uCi1KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTj1TZWxlY3QgJkltcGxlbWVudGF0aW9uOgotSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT05fVE9PTFRJUD1TZWxlY3QgdGhlIEltcGxlbWVudGF0aW9uCi0KLVdTREwySkFWQV9GUk9OVEVORF9UT09MVElQPVNwZWNpZnkgdGhlIGZyb250ZW5kLiBEZWZhdWx0IGlzIEpBWFdTLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBKQVhXUyBmcm9udGVuZAotV1NETDJKQVZBX0RBVEFCSU5ESU5HX1RPT0xUSVA9U3BlY2lmeSB0aGUgZGF0YWJpbmRpbmcuIERlZmF1bHQgaXMgSkFYQi4gQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgSkFYQiBkYXRhYmluZGluZwotV1NETDJKQVZBX1dTRExfVkVSU0lPTl9UT09MVElQPVNwZWNpZnkgdGhlIHdzZGwgdmVyc2lvbiAuRGVmYXVsdCBpcyBXU0RMMS4xLiBDdXJyZW50bHkgc3VwcG9ydHMgb25seSBXU0RMMS4xIHZlcnNpb24KLVdTREwySkFWQV9HRU5FUkFURV9JTVBMRU1FTlRBVElPTl9UT09MVElQPUdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIG9iamVjdAotV1NETDJKQVZBX0dFTkVSQVRFX0NMSUVOVF9UT09MVElQPUdlbmVyYXRlIHRoZSBjbGllbnQgY29kZQotV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQPUdlbmVyYXRlIHRoZSBzZXJ2ZXIgY29kZQotV1NETDJKQVZBX0RFRkFVTFRfVkFMVUVTX1RPT0xUSVA9R2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZCBjbGllbnQuIElnbm9yZWQgaWYgaW1wbGVtZW50YXRpb24gb3IgY2xpZW50IGlzIG5vdCBiZWluZyBnZW5lcmF0ZWQKLVdTREwySkFWQV9FWENMVURFX05BTUVTUEFDRV9UT09MVElQPUlnbm9yZSB0aGUgc3BlY2lmaWVkIFdTREwgc2NoZW1hIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIGNvZGUKLVdTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQPUVuYWJsZXMgb3IgZGlzYWJsZXMgcHJvY2Vzc2luZyBvZiBleHRlbmRlZCBzb2FwIGhlYWRlciBtZXNzYWdlIGJpbmRpbmcKLVdTREwySkFWQV9ERUZBVUxUX05BTUVTUEFDRV9MT0FESU5HX1RPT0xUSVA9RW5hYmxlcyBvciBkaXNhYmxlcyBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBwYWNrYWdlIG5hbWUgbWFwcGluZwotV1NETDJKQVZBX0VYQ0xVREVfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUD1FbmFibGVzIG9yIGRpc2FibGVzIGxvYWRpbmcgb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmcKLVdTREwySkFWQV9XU0RMX0xPQ0FUSU9OX1RPT0xUSVA9U3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbidzIHdzZGxMb2NhdGlvbiBwcm9wZXJ0eQotV1NETDJKQVZBX1hNTF9DQVRBTE9HX1RPT0xUSVA9U3BlY2lmeSB0aGUgVVJMIG9mIGFuIFhNTCBjYXRhbG9nIHRvIHVzZSBmb3IgcmVzb2x2aW5nIGltcG9ydGVkIHNjaGVtYXMgYW5kIFdTREwgZG9jdW1lbnRzCi1XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HPVVzZSB0aGUgezB9IHByb3ByaWV0YXJ5IFdTLSZBZGRyZXNzaW5nIHR5cGUKLVdTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkdfVE9PTFRJUD1Vc2UgdGhlIHswfSBwcm9wcmlldGFyeSBXUy1BZGRyZXNzaW5nIHR5cGUgaW5zdGVhZCBvZiB0aGUgSkFYLVdTIDIuMSBjb21wbGlhbnQgbWFwcGluZwotV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OPUVuYWJsZSBBdXRvIE5hbWUgUmVzb2x1dGlvbgotV1NETDJKQVZBX0FVVE9fTkFNRV9SRVNPTFVUSU9OX1RPT0xUSVA9QXV0b21hdGljYWxseSByZXNvbHZlIG5hbWluZyBjb25mbGljdHMgd2l0aG91dCByZXF1aXJpbmcgdGhlIHVzZSBvZiBiaW5kaW5nIGN1c3RvbWl6YXRpb25zCi1XU0RMMkpBVkFfWEpDX0FSR1NfVE9PTFRJUD1TcGVjaWZ5IHRoZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBYSkMKLVdTREwySkFWQV9YSkNfQVJHX0dST1VQX1RJVExFPVhKQyBBcmd1bWVudHMKLVdTREwySkFWQV9YSkNfQVJHX0NPTFVNTl9OQU1FPVhKQyBBcmcKLVdTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUU9RGVzY3JpcHRpb24KLVdTREwySkFWQV9YSkNfREVGQVVMVF9WQUxVRVM9SW5pdGlhbGlzZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlcwotV1NETDJKQVZBX1hKQ19UT1NUUklORz1BY3RpdmF0ZSBwbHVnaW4gdG8gYWRkIGEgdG9TdHJpbmcoKSBtZXRob2QgdG8gZ2VuZXJhdGVkIGNsYXNzZXMKLVdTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FPUhhdmUgdG9TdHJpbmcgcHJvZHVjZSBtdWx0aSBsaW5lIG91dHB1dAotV1NETDJKQVZBX1hKQ19UT1NUUklOR19TSU1QTEU9SGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dAotV1NETDJKQVZBX1hKQ19MT0NBVE9SPUVuYWJsZSBzb3VyY2UgbG9jYXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGNvZGUKLVdTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTPUdlbmVyYXRlIGFjY2Vzc29yIG1ldGhvZHMgd2l0aCB0aGUgJ3N5bmNocm9uaXplZCcga2V5d29yZAotV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRD1BZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGUKLSNNYXJrIHRoZSBnZW5lcmF0ZWQgY29kZSBhcyBAamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQKLVdTREwySkFWQV9YSkNfRVBJU09ERV9GSUxFPSBHZW5lcmF0ZSB0aGUgZXBpc29kZSBmaWxlIGZvciBzZXBhcmF0ZSBjb21waWxhdGlvbgotI1Jlc291cmNlIFNlbGVjdGlvbiBEaWFsb2cKLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTj1Ccm93c2UgV29ya3NwYWNlLi4uCi1SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfU1lTVEVNX0JVVFRPTj1Ccm93c2UgRmlsZSBTeXN0ZW0uLi4KLVJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfRklMRV9OT1RfRk9VTkRfRVJST1I9RmlsZSBOb3QgRm91bmQKLQotV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUlk9Jk91dHB1dCBEaXJlY3Rvcnk6Ci1XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQPVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgY29kZSBmaWxlcyBhcmUgd3JpdHRlbgotCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FPSZQYWNrYWdlIE5hbWU6Ci1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX1RPT0xUSVA9VGhlIGphdmEgcGFja2FnZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlCi0KLVdTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUw9U3BlY2lmeSAmV1NETCBOYW1lcHNhY2UgdG8gUGFja2FnZSBOYW1lIE1hcHBpbmdzCi1XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX09QVElPTkFMX1RPT0xUSVA9T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSB3c2RsIG5hbWVzcGFjZSBtYXBwaW5nIHRvIGEgcGFydGljdWxhciBqYXZhIHBhY2thZ2UgbmFtZQotCi1XU0RMMkpBVkFfV1NETF9OQU1FU1BBQ0VfQ09MVU1OX0hFQURFUj1XU0RMIE5hbWVzcGFjZQotV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9DT0xVTU5fSEVBREVSPVBhY2thZ2UgTmFtZQotCi1XU0RMMkpBVkFfU0VSVklDRV9OQU1FPSZTZXJ2aWNlIE5hbWU6Ci1XU0RMMkpBVkFfU0VSVklDRV9OQU1FX1RPT0xUSVA9U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZvciB3aGljaCBjb2RlIGlzIHRvIGJlIGdlbmVyYXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudAotCi1XU0RMMkpBVkFfQklORElOR19GSUxFUz0mQmluZGluZyBGaWxlczoKLVdTREwySkFWQV9CSU5ESU5HX05BTUVfVE9PTFRJUD1TcGVjaWZ5IHplcm8sIG9yIG1vcmUsIEpBWFdTIG9yIEpBWEIgYmluZGluZyBmaWxlcwotV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfQUREPSZBZGQuLi4KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVTX1JFTU9WRT0mUmVtb3ZlLi4uCi0KLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX1RJVExFPUJyb3dzZSBmb3IgQmluZGluZyBGaWxlCi1XU0RMMkpBVkFfQklORElOR19GSUxFX0RJQUxPR19NRVNTQUdFPUJpbmRpbmcgRmlsZToKLVdTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX0ZJTFRFUl9OQU1FPUpBWFdTIG9yIEpBWEIgQmluZGluZyBGaWxlcyAoKi54bWwpCi0KLVdTREwySkFWQV9YTUxfQ0FUTE9HPVhNTCBDYXRhbG9nOgotV1NETDJKQVZBX1hNTF9DQVRMT0dfVE9PTFRJUD1TcGVjaWZ5IGNhdGFsb2cgZmlsZSB0byBtYXAgdGhlIGltcG9ydGVkIHdzZGwvc2NoZW1hCi1XU0RMMkpBVkFfWE1MX0NBVExPR19CUk9XU0U9QnJvd3NlLi4uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL2RpYWxvZ3MvUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlZmNkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvZGlhbG9ncy9SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQSA8Y29kZT5TZWxlY3Rpb25TdGF0dXNEaWFsb2c8L2NvZGU+IHdoaWNoIGFsbG93cyB0aGUgc2VsZWN0aW9uIG9mIGZpbGVzCi0gKiB3aXRoIGEgc3BlY2lmaWMgZXh0ZW5zaW9uIGZyb20gdGhlIHdvcmtzcGFjZSBvciBmaWxlIHN5c3RlbS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBTZWxlY3Rpb25TdGF0dXNEaWFsb2cgewotICAgIHByaXZhdGUgSVN0YXR1cyBPS19GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgSVN0YXR1cyBFUlJPUl9GSUxFX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5SRVNPVVJDRV9TRUxFQ1RJTl9ESUFMT0dfQlJPV1NFX0ZJTEVfTk9UX0ZPVU5EX0VSUk9SKTsKLQotICAgIHByaXZhdGUgSVN0YXR1cyBWQUxJREFURV9TRUxFQ1RJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBUZXh0IHJlc291cmNlVGV4dDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlckV4dGVuc2lvbjsKLSAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJOYW1lOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8Y29kZT5SZXNvdXJjZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcGFyZW50Ci0gICAgICogQHBhcmFtIGZpbHRlckV4dGVuc2lvbgotICAgICAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSBleHRlbnNpb24gd2hpY2ggdGhlIGRpYWxvZ3Mgd2lsbCB1c2UgdG8gZmlsdGVyCi0gICAgICogICAgICAgICAgICBmaWxlcwotICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lCi0gICAgICogICAgICAgICAgICB0aGUgbmFtZSB0aGF0IGRlc2NyaWJlcyB0aGUgZmlsdGVyRXh0ZW5zaW9uCi0gICAgICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0gICAgICogICAgICAgICAgICB0aGUgZGlhbG9nIHRpdGxlCi0gICAgICovCi0gICAgcHVibGljIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGZpbHRlckV4dGVuc2lvbiwgU3RyaW5nIGZpbHRlck5hbWUsIFN0cmluZyBkaWFsb2dUaXRsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotCi0gICAgICAgIHRoaXMuZmlsdGVyRXh0ZW5zaW9uID0gZmlsdGVyRXh0ZW5zaW9uOwotICAgICAgICB0aGlzLmZpbHRlck5hbWUgPSBmaWx0ZXJOYW1lOwotCi0gICAgICAgIHNldFRpdGxlKGRpYWxvZ1RpdGxlKTsKLSAgICAgICAgc2V0U3RhdHVzTGluZUFib3ZlQnV0dG9ucyh0cnVlKTsKLSAgICAgICAgaW50IHNoZWxsU3R5bGUgPSBnZXRTaGVsbFN0eWxlKCk7Ci0gICAgICAgIHNldFNoZWxsU3R5bGUoc2hlbGxTdHlsZSB8IFNXVC5NQVggfCBTV1QuUkVTSVpFKTsKLSAgICAgICAgdXBkYXRlU3RhdHVzKFZBTElEQVRFX1NFTEVDVElPTl9TVEFUVVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gNTAwOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IGNyZWF0ZU1lc3NhZ2VBcmVhKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBicm93c2VXb3Jrc3BhY2UgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICBicm93c2VXb3Jrc3BhY2Uuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLlJFU09VUkNFX1NFTEVDVElOX0RJQUxPR19CUk9XU0VfV09SS1NQQUNFX0JVVFRPTik7Ci0gICAgICAgIGJyb3dzZVdvcmtzcGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBjcmVhdGVXb3Jrc3BhY2VSZXNvdXJjZURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gU2VsZWN0aW9uRGlhbG9nLk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVRleHQuc2V0VGV4dChyZXNvdXJjZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYnJvd3NlV29ya3NwYWNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEJ1dHRvbiBicm93c2VGaWxlU3lzdGVtID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlRmlsZVN5c3RlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuUkVTT1VSQ0VfU0VMRUNUSU5fRElBTE9HX0JST1dTRV9GSUxFX1NZU1RFTV9CVVRUT04pOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBjcmVhdGVGaWxlU3lzdGVtUmVzb3VyY2VEaWFsb2coY29tcG9zaXRlLmdldFNoZWxsKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElQYXRoIGZpbHRlclBhdGggPSBuZXcgUGF0aChkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYnVpbGRGaWxlTmFtZSA9IGRpYWxvZy5nZXRGaWxlTmFtZSgpOwotICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBmaWx0ZXJQYXRoLmFwcGVuZChidWlsZEZpbGVOYW1lKS5tYWtlQWJzb2x1dGUoKTsKLQotICAgICAgICAgICAgICAgIHJlc291cmNlVGV4dC5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBicm93c2VGaWxlU3lzdGVtLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJlc291cmNlVGV4dCA9IG5ldyBUZXh0KGJ1dHRvbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICByZXNvdXJjZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlID0gcmVzb3VyY2VUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KEFycmF5cy5hc0xpc3QocmVzb3VyY2UpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKE9LX0ZJTEVfU1RBVFVTKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0dXMoRVJST1JfRklMRV9TVEFUVVMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgcmVzb3VyY2VUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTZWxlY3Rpb25EaWFsb2cgY3JlYXRlV29ya3NwYWNlUmVzb3VyY2VEaWFsb2coU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0gICAgICAgICAgICAgICAgbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRUaXRsZShnZXRNZXNzYWdlKCkpOwotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRNZXNzYWdlKGZpbHRlck5hbWUpOwotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuaXNBY2Nlc3NpYmxlKCkgJiYgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKGZpbHRlckV4dGVuc2lvbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiAhKChJUHJvamVjdCkgZWxlbWVudCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3QuaXNBY2Nlc3NpYmxlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdCh2aWV3ZXIsIHBhcmVudEVsZW1lbnQsIHJlc291cmNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICB3b3Jrc3BhY2VSZXNvdXJjZURpYWxvZy5zZXRWYWxpZGF0b3IobmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb25bMF07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBzZWxlY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZmlsdGVyRXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPS19GSUxFX1NUQVRVUzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gVkFMSURBVEVfU0VMRUNUSU9OX1NUQVRVUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgd29ya3NwYWNlUmVzb3VyY2VEaWFsb2cuc2V0SW5wdXQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHdvcmtzcGFjZVJlc291cmNlRGlhbG9nOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZURpYWxvZyBjcmVhdGVGaWxlU3lzdGVtUmVzb3VyY2VEaWFsb2coU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhzaGVsbCwgU1dULk9QRU4pOwotICAgICAgICBkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKiIgKyBmaWx0ZXJFeHRlbnNpb24gfSk7IC8vJE5PTi1OTFMtMSQ7Ci0gICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJOYW1lcyhuZXcgU3RyaW5nW10geyBmaWx0ZXJOYW1lIH0pOwotICAgICAgICByZXR1cm4gZGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS9wcmVmZXJlbmNlcy9DWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4ZjNjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJlZmVyZW5jZXMvQ1hGUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHMuQW5ub3RhdGlvbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0cy5KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLkphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzLlNwcmluZ0NvbmZpZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHMuQ1hGSW5zdGFsbFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0gICAgLy8gICAgcHJpdmF0ZSBJU3RhdHVzIENYRl9MT0NBVElPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbnVsbCk7Ci0gICAgLy8gICAgcHJpdmF0ZSBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAvLwotICAgIHByaXZhdGUgSVNlbGVjdGlvbiBwcmV2aW91c0luc3RhbGwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGVkaXRCdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN4Zkluc3RhbGxhdGlvbnM7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b247Ci0KLSAgICBwcml2YXRlIENYRkNvbnRleHQgY29udGV4dDsKLQotICAgIHByaXZhdGUgSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIEphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSA7Ci0KLSAgICBwcml2YXRlIENYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIENYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNDb21wb3NpdGUgYW5ub3RhdGlvbnNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZSBzcHJpbmdDb25maWdDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IGphdmEyV1NTdGFja0xheW91dDsKLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IHdzZGwyamF2YVN0YWNrTGF5b3V0OwotICAgIHByaXZhdGUgU3RhY2tMYXlvdXQgamF4d3NTdGFja0xheW91dDsKLSAgICBwcml2YXRlIFN0YWNrTGF5b3V0IHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0OwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgamF2YTJXU1ByZWZlcm5jZXNHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwOwotICAgIHByaXZhdGUgQ29tcG9zaXRlIGpheHdzUHJlZmVyZW5jZXNHcm91cDsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXA7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIENvbXBvc2l0ZSBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIENvbXBvc2l0ZSB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBDb21wb3NpdGUgc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGphdmEyV1NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUgd3NkbDJKYXZhQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGpheHdzQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICBwcml2YXRlIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIHNwcmluZ0NvbmZpZ0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0KLSAgICBwcml2YXRlIEltYWdlIGxpYnJhcnlJbWFnZTsKLQotICAgIHB1YmxpYyBDWEZSdW50aW1lUHJlZmVyZW5jZVBhZ2UoKSB7Ci0gICAgICAgIGxpYnJhcnlJbWFnZSA9IENYRlVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvb2JqMTYvbGlicmFyeV9vYmouZ2lmIikuY3JlYXRlSW1hZ2UoKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgbWFpbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobWFpbkxheW91dCk7Ci0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBUYWJGb2xkZXIgY3hmUHJlZmVyZW5jZVRhYiA9IG5ldyBUYWJGb2xkZXIoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGN4ZlByZWZlcmVuY2VUYWIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy9DWEYgUnVudGltZSBMb2NhdGlvbgotICAgICAgICBUYWJJdGVtIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX0hPTUVfVEFCX05BTUUpOwotICAgICAgICBydW50aW1lSW5zdGFsTG9jYXRpb25JdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX1JVTlRJTUVfSE9NRV9UQUJfVE9PTFRJUCk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIHJ1bnRpbWVHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIHJ1bnRpbWVJbnN0YWxMb2NhdGlvbkl0ZW0uc2V0Q29udHJvbChydW50aW1lR3JvdXApOwotICAgICAgICBydW50aW1lR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9IT01FX1RBQl9UT09MVElQKTsKLQotICAgICAgICBHcmlkTGF5b3V0IHJ1bnRpbWVMb2FjdGlvbmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHJ1bnRpbWVMb2FjdGlvbmxheW91dC5udW1Db2x1bW5zID0gMzsKLSAgICAgICAgcnVudGltZUxvYWN0aW9ubGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotICAgICAgICBydW50aW1lR3JvdXAuc2V0TGF5b3V0KHJ1bnRpbWVMb2FjdGlvbmxheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIHJ1bnRpbWVHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBydW50aW1lVGFiRGVzY3JpcHRpb25MYWJlbCA9IG5ldyBMYWJlbChydW50aW1lR3JvdXAsIFNXVC5XUkFQKTsKLSAgICAgICAgcnVudGltZVRhYkRlc2NyaXB0aW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9ERVNDUklQVElPTl9MQUJFTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0KLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0gICAgICAgIHJ1bnRpbWVUYWJEZXNjcmlwdGlvbkxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIFRhYmxlIGluc3RhbGxUYWJsZSA9IG5ldyBUYWJsZShydW50aW1lR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIKLSAgICAgICAgICAgICAgICB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0gICAgICAgIGluc3RhbGxUYWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0gICAgICAgIGluc3RhbGxUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIFRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0gICAgICAgIGluc3RhbGxUYWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihpbnN0YWxsVGFibGUpOwotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWRJbnN0YWxsKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2hlY2tlZEluc3RhbGwobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGludCBub0VsZW1lbnRzID0gc2VsZWN0aW9uLnNpemUoKTsKLSAgICAgICAgICAgICAgICBpZiAobm9FbGVtZW50cyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlZGl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHZlcnNpb25WaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4oY3hmSW5zdGFsbGF0aW9ucywgU1dULkxFRlQpOwotICAgICAgICB2ZXJzaW9uVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgaW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGluc3RhbGwuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaWJyYXJ5SW1hZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgVGFibGVDb2x1bW4gdmVyc2lvbkNvbHVtbiA9IHZlcnNpb25WaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHZlcnNpb25Db2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9WRVJTSU9OX0NPTFVNTl9OQU1FKTsKLSAgICAgICAgdmVyc2lvbkNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgQ29sdW1uV2VpZ2h0RGF0YSBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNTAsIDUwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZVZpZXdlckNvbHVtbiBsb2NhdGlvblZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihjeGZJbnN0YWxsYXRpb25zLCBTV1QuTEVGVCk7Ci0gICAgICAgIGxvY2F0aW9uVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IENvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgaW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgVGFibGVDb2x1bW4gbG9jYXRpb25Db2x1bW4gPSBsb2NhdGlvblZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgbG9jYXRpb25Db2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9MT0NBVElPTl9DT0xVTU5fTkFNRSk7Ci0gICAgICAgIGxvY2F0aW9uQ29sdW1uLnBhY2soKTsKLQotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoNTAsIDE1MCwgdHJ1ZSk7Ci0gICAgICAgIHRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sdW1uV2VpZ2h0RGF0YSk7Ci0KLSAgICAgICAgVGFibGVWaWV3ZXJDb2x1bW4gdHlwZVZpZXdlckNvbHVtbiA9IG5ldyBUYWJsZVZpZXdlckNvbHVtbihjeGZJbnN0YWxsYXRpb25zLCBTV1QuTEVGVCk7Ci0gICAgICAgIHR5cGVWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YWxsLmdldFR5cGUoKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHR5cGVDb2x1bW4gPSB0eXBlVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICB0eXBlQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfVFlQRV9DT0xVTU5fTkFNRSk7Ci0gICAgICAgIHR5cGVDb2x1bW4ucGFjaygpOwotCi0gICAgICAgIGNvbHVtbldlaWdodERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDU7Ci0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjeGZJbnN0YWxsYXRpb25zLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqMSBpbnN0YW5jZW9mIENYRkluc3RhbGwgJiYgb2JqMiBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ1hGSW5zdGFsbCkgb2JqMSkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkudHJpbSgpLmNvbXBhcmVUbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENYRkluc3RhbGwpIG9iajIpLmdldFZlcnNpb24oKS50b1N0cmluZygpLnRyaW0oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgb2JqMSwgb2JqMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuc2V0SW5wdXQoY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCkpOwotCi0gICAgICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24ocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkZEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0FERF9CVVRUT05fTEFCRUwpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgQ1hGSW5zdGFsbFdpemFyZCBpbnN0YWxsV2l6YXJkID0gbmV3IENYRkluc3RhbGxXaXphcmQoKTsKLSAgICAgICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhnZXRTaGVsbCgpLCBpbnN0YWxsV2l6YXJkKTsKLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBlZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VESVRfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjeGZJbnN0YWxsYXRpb25zLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBDWEZJbnN0YWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vaW50IHNlbGVjdGVkSW5zdGFsbCA9IGN4Zkluc3RhbGxhdGlvbnMuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hlY2tlZFZlcnNpb24gPSBnZXRDaGVja2VkVmVyc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBDWEZJbnN0YWxsV2l6YXJkIGluc3RhbGxXaXphcmQgPSBuZXcgQ1hGSW5zdGFsbFdpemFyZCgoQ1hGSW5zdGFsbCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgaW5zdGFsbFdpemFyZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZFZlcnNpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWRWZXJzaW9uKGNoZWNrZWRWZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLSAgICAgICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUkVNT1ZFX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN4Zkluc3RhbGxhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgSXRlcmF0b3I8Q1hGSW5zdGFsbD4gaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnMucmVtb3ZlKGluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnN0YWxsYXRpb25zKGluc3RhbGxhdGlvbnMpOwotICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIGlmIChjeGZJbnN0YWxsYXRpb25zLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldENoZWNrZWRJbnN0YWxsKG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICBMYWJlbCBwYWRkaW5nTGFiZWwgPSBuZXcgTGFiZWwocnVudGltZUdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBwYWRkaW5nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uID0gbmV3IEJ1dHRvbihydW50aW1lR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0VYUE9SVF9DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUik7Ci0gICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpKTsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGlmIChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL0phdmEyV1MKLSAgICAgICAgVGFiSXRlbSBqYXZhMldTVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgamF2YTJXU1RhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX05BTUUpOwotICAgICAgICBqYXZhMldTVGFiSXRlbS5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIGphdmEyV1NQcmVmZXJuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLSAgICAgICAgamF2YTJXU1ByZWZlcm5jZXNHcm91cC5zZXRMYXlvdXQoamF2YTJXU1N0YWNrTGF5b3V0KTsKLQotICAgICAgICBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoamF2YTJXU1ByZWZlcm5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGphdmEyV1NHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dChqYXZhMldTR3JpZExheW91dCk7Ci0KLSAgICAgICAgamF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICBqYXZhMldTRExQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUsIGN4ZlByZWZlcmVuY2VUYWIpOwotICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuYWRkQ29udHJvbHMoKTsKLQotICAgICAgICBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGphdmEyV1NQcmVmZXJuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMldTRExHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoamF2YTJXU0RMR3JpZExheW91dCk7Ci0KLSAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBKYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIGphdmEyV1NQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgU1dULk5PTkUsIGN4ZlByZWZlcmVuY2VUYWIpOwotICAgICAgICBqYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmFkZENvbnRyb2xzKCk7Ci0KLSAgICAgICAgamF2YTJXU0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoamF2YTJXU1ByZWZlcm5jZXNHcm91cCwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0KLSAgICAgICAgamF2YTJXU1RhYkl0ZW0uc2V0Q29udHJvbChqYXZhMldTUHJlZmVybmNlc0dyb3VwKTsKLQotICAgICAgICAvL1dTREwySmF2YQotICAgICAgICBUYWJJdGVtIHdzZGwySmF2YVRhYkl0ZW0gPSBuZXcgVGFiSXRlbShjeGZQcmVmZXJlbmNlVGFiLCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGwySmF2YVRhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIHdzZGwySmF2YVRhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICB3c2RsMmphdmFTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICB3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLnNldExheW91dCh3c2RsMmphdmFTdGFja0xheW91dCk7Ci0KLSAgICAgICAgd3NkbDJKYXZhMjBQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGwySmF2YTIwR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlLnNldExheW91dCh3c2RsMkphdmEyMEdyaWRMYXlvdXQpOwotCi0gICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSgKLSAgICAgICAgICAgICAgICB3c2RsMkphdmEyMFByZWZlcmVuY2VzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGN4ZjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuYWRkQ29udHJvbHMoKTsKLQotICAgICAgICB3c2RsMkphdmEyMVByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh3c2RsMkphdmFQcmVmZXJlbmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJKYXZhMjFHcmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0TGF5b3V0KHdzZGwySmF2YTIxR3JpZExheW91dCk7Ci0KLSAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKAotICAgICAgICAgICAgICAgIHdzZGwySmF2YTIxUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3hmMjFXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5hZGRDb250cm9scygpOwotCi0gICAgICAgIHdzZGwySmF2YUJsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUod3NkbDJKYXZhUHJlZmVyZW5jZXNHcm91cCwKLSAgICAgICAgICAgICAgICBTV1QuTk9ORSk7Ci0KLSAgICAgICAgd3NkbDJKYXZhVGFiSXRlbS5zZXRDb250cm9sKHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXApOwotCi0gICAgICAgIC8vSkFYLVdTCi0gICAgICAgIFRhYkl0ZW0gYW5ub3RhdGlvbnNUYWJJdGVtID0gbmV3IFRhYkl0ZW0oY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotICAgICAgICBhbm5vdGF0aW9uc1RhYkl0ZW0uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX1RBQl9OQU1FKTsKLSAgICAgICAgYW5ub3RhdGlvbnNUYWJJdGVtLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuQU5OT1RBVElPTlNfUFJFRkVSRU5DRVNfVEFCX1RPT0xUSVApOwotCi0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNHcm91cCA9IG5ldyBDb21wb3NpdGUoY3hmUHJlZmVyZW5jZVRhYiwgU1dULk5PTkUpOwotCi0gICAgICAgIGpheHdzU3RhY2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0dyb3VwLnNldExheW91dChqYXh3c1N0YWNrTGF5b3V0KTsKLQotICAgICAgICBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShqYXh3c1ByZWZlcmVuY2VzR3JvdXAsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBqYXh3c0dyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoamF4d3NHcmlkTGF5b3V0KTsKLSAgICAgICAgYW5ub3RhdGlvbnNDb21wb3NpdGUgPSBuZXcgQW5ub3RhdGlvbnNDb21wb3NpdGUoamF4d3NQcmVmZXJlbmNlc0NvbXBvc2l0ZSwgIFNXVC5TSEFET1dfSU4pOwotCi0gICAgICAgIGpheHdzQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShqYXh3c1ByZWZlcmVuY2VzR3JvdXAsCi0gICAgICAgICAgICAgICAgU1dULk5PTkUpOwotCi0gICAgICAgIGFubm90YXRpb25zVGFiSXRlbS5zZXRDb250cm9sKGpheHdzUHJlZmVyZW5jZXNHcm91cCk7Ci0KLSAgICAgICAgLy9TcHJpbmcgQ29uZmlnCi0gICAgICAgIFRhYkl0ZW0gc3ByaW5nQ29uZmlnVGFiSXRlbSA9IG5ldyBUYWJJdGVtKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnVGFiSXRlbS5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19QUkVGRVJFTkNFU19UQUJfTkFNRSk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ1RhYkl0ZW0uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1BSRUZFUkVOQ0VTX1RBQl9UT09MVElQKTsKLQotICAgICAgICBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGN4ZlByZWZlcmVuY2VUYWIsIFNXVC5OT05FKTsKLQotICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dCA9IG5ldyBTdGFja0xheW91dCgpOwotICAgICAgICBzcHJpbmdDb25maWdQcmVmZXJuY2VzR3JvdXAuc2V0TGF5b3V0KHNwcmluZ0NvbmZpZ1N0YWNrTGF5b3V0KTsKLQotICAgICAgICBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgc3ByaW5nR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBzcHJpbmdQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoc3ByaW5nR3JpZExheW91dCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZSA9IG5ldyBTcHJpbmdDb25maWdDb21wb3NpdGUoc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGUsIFNXVC5TSEFET1dfSU4pOwotCi0gICAgICAgIHNwcmluZ0NvbmZpZ0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGUgPSBuZXcgQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwLAotICAgICAgICAgICAgICAgIFNXVC5OT05FKTsKLQotICAgICAgICBzcHJpbmdDb25maWdUYWJJdGVtLnNldENvbnRyb2woc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwKTsKLQotICAgICAgICBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsID0gZ2V0RGVmYXVsdEluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0SW5zdGFsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaGFuZGxlUHJlZmVyZW5jZUNvbnRyb2xzKCk7Ci0KLSAgICAgICAgY29tcG9zaXRlLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0RGVmYXVsdEluc3RhbGwoKSB7Ci0gICAgICAgIENvbGxlY3Rpb248Q1hGSW5zdGFsbD4gc2V0ID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7Ci0gICAgICAgIEl0ZXJhdG9yPENYRkluc3RhbGw+IHNldEl0ZXJhdG9yID0gc2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChzZXRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIENYRkluc3RhbGwgZW50cnkgPSBzZXRJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscyhjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRDaGVja2VkVmVyc2lvbigpIHsKLSAgICAgICAgT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzID0gY3hmSW5zdGFsbGF0aW9ucy5nZXRDaGVja2VkRWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGNoZWNrZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChDWEZJbnN0YWxsKSBjaGVja2VkRWxlbWVudHNbMF0pLmdldFZlcnNpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2hlY2tlZFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLSAgICAgICAgVGFibGVJdGVtW10gdGFibGVJdGVtcyA9IGN4Zkluc3RhbGxhdGlvbnMuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKFRhYmxlSXRlbSBpbnN0YWxsIDogdGFibGVJdGVtcykgewotICAgICAgICAgICAgaWYgKGluc3RhbGwuZ2V0VGV4dCgwKS5lcXVhbHModmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICBpbnN0YWxsLnNldENoZWNrZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0Q2hlY2tlZEluc3RhbGwoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLmVxdWFscyhwcmV2aW91c0luc3RhbGwpKSB7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNJbnN0YWxsID0gc2VsZWN0aW9uOwotICAgICAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLSAgICAgICAgICAgICAgICBDWEZJbnN0YWxsIGluc3RhbGwgPSAoQ1hGSW5zdGFsbCkgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN4Zkluc3RhbGxhdGlvbnMuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbXXsgaW5zdGFsbCB9KTsKLSAgICAgICAgICAgICAgICAgICAgY3hmSW5zdGFsbGF0aW9ucy5yZXZlYWwoaW5zdGFsbCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVWZXJzaW9uKGluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKGluc3RhbGwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKGluc3RhbGwuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXREZWZhdWx0UnVudGltZVR5cGUoIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGV4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lckJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlUHJlZmVyZW5jZUNvbnRyb2xzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlUHJlZmVyZW5jZUNvbnRyb2xzKCkgewotICAgICAgICBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZUxvY2F0aW9uKCkuZXF1YWxzKCIiKSB8fCBjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGphdmEyV1NCbGFua1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHdzZGwySmF2YUJsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBqYXh3c1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXh3c0JsYW5rUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dC50b3BDb250cm9sID0gc3ByaW5nQ29uZmlnQmxhbmtQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgamF2YTJXU1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXZhMldTUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICB3c2RsMmphdmFTdGFja0xheW91dC50b3BDb250cm9sID0gd3NkbDJKYXZhMjFQcmVmZXJlbmNlc0NvbXBvc2l0ZTsKLSAgICAgICAgICAgIGpheHdzU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGpheHdzUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBzcHJpbmdDb25maWdTdGFja0xheW91dC50b3BDb250cm9sID0gc3ByaW5nUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqYXZhMldTU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IGphdmEyV1NETFByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgd3NkbDJqYXZhU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHdzZGwySmF2YTIwUHJlZmVyZW5jZXNDb21wb3NpdGU7Ci0gICAgICAgICAgICBqYXh3c1N0YWNrTGF5b3V0LnRvcENvbnRyb2wgPSBqYXh3c1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICAgICAgc3ByaW5nQ29uZmlnU3RhY2tMYXlvdXQudG9wQ29udHJvbCA9IHNwcmluZ1ByZWZlcmVuY2VzQ29tcG9zaXRlOwotICAgICAgICB9Ci0gICAgICAgIGphdmEyV1NQcmVmZXJuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIHdzZGwySmF2YVByZWZlcmVuY2VzR3JvdXAubGF5b3V0KCk7Ci0gICAgICAgIGpheHdzUHJlZmVyZW5jZXNHcm91cC5sYXlvdXQoKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnUHJlZmVybmNlc0dyb3VwLmxheW91dCgpOwotICAgICAgICByZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgLy8gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXR1cygpIHsKLSAgICAvLyAgICAgICAgLy8gICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IGNoZWNrUnVudGltZUV4aXN0KGN4ZkhvbWVEaXJUZXh0LmdldFRleHQoKSk7Ci0gICAgLy8gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIC8vICAgIH0KLQotICAgIC8vICAgIHByaXZhdGUgdm9pZCBhcHBseVN0YXR1c1RvUGFnZShJU3RhdHVzIHN0YXR1cykgewotICAgIC8vICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgLy8gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IElTdGF0dXMuT0spIHsKLSAgICAvLyAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLSAgICAvLyAgICAgICAgfSBlbHNlIHsKLSAgICAvLyAgICAgICAgICAgIHNldE1lc3NhZ2UoZ2V0VGl0bGUoKSk7Ci0gICAgLy8gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgLy8gICAgICAgIH0KLSAgICAvLwotICAgIC8vICAgIH0KLSAgICAvLwotICAgIC8vICAgIHByaXZhdGUgSVN0YXR1cyBmaW5kTW9zdFNldmVyZSgpIHsKLSAgICAvLyAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgLy8gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBleHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhULCBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19FWFBPUlRfQ1hGX0NMQVNTUEFUSF9DT05UQUlORVIpKTsKLQotICAgICAgICBqYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zZXREZWZhdWx0cygpOwotICAgICAgICBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgYW5ub3RhdGlvbnNDb21wb3NpdGUuc2V0RGVmYXVsdHMoKTsKLSAgICAgICAgc3ByaW5nQ29uZmlnQ29tcG9zaXRlLnNldERlZmF1bHRzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7Ci0gICAgICAgIGlmIChjb250ZXh0LmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpLmNvbXBhcmVUbyhDWEZDb3JlUGx1Z2luLkNYRl9WRVJTSU9OXzJfMSkgPj0gMCkgewotICAgICAgICAgICAgamF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBjeGYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnJlZnJlc2goKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5yZWZyZXNoKCk7Ci0gICAgICAgICAgICBjeGYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLnJlZnJlc2goKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRFeHBvcnRDWEZDbGFzc3BhdGhDb250YWluZXIoZXhwb3J0Q1hGQ2xhc3NwYXRoQ29udGFpbmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQotICAgICAgICBpZiAoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKS5jb21wYXJlVG8oQ1hGQ29yZVBsdWdpbi5DWEZfVkVSU0lPTl8yXzEpID49IDApIHsKLSAgICAgICAgICAgIGphdmEyV1NSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgICAgIGN4ZjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICAgICAgY3hmMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgICAgICB9Ci0gICAgICAgIGFubm90YXRpb25zQ29tcG9zaXRlLnN0b3JlVmFsdWVzKCk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5zdG9yZVZhbHVlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLSAgICAgICAgc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnBlcmZvcm1DYW5jZWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0gICAgICAgIHN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgICAgICBzZXREZWZhdWx0cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgICAgICAgc3RvcmVWYWx1ZXMoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBpZiAobGlicmFyeUltYWdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxpYnJhcnlJbWFnZS5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBsaWJyYXJ5SW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3Byb3BlcnRpZXMvQ1hGUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJvcGVydGllcy9DWEZQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA0OWRhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvcHJvcGVydGllcy9DWEZQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi1wdWJsaWMgY2xhc3MgQ1hGUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLSAgICBwcml2YXRlIENvbWJvVmlld2VyIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlcjsKLSAgICBwcml2YXRlIExpbmsgbGluazsKLSAgICBwcml2YXRlIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGw7Ci0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBwdWJsaWMgQ1hGUHJvcGVydHlQYWdlKCkgewotICAgICAgICBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIElBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgbGluayA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfQ09ORklHVVJFX0lOU1RBTExFRF9SVU5USU1FU19MQUJFTCk7Ci0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWRJbmRleCA9IGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UifSwgbnVsbCkub3BlbigpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2VsZWN0KHNlbGVjdGVkSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBsaW5rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1BST1BFUlRZX1BBR0VfUlVOVElNRV9MQUJFTCk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uPD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIiArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0SW5wdXQoaW5zdGFsbGF0aW9ucyk7Ci0KLSAgICAgICAgU3RyaW5nIGludGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QpOwotICAgICAgICBkZWZhdWx0SW5zdGFsbCA9IGNvbnRleHQuZ2V0SW5zdGFsbGF0aW9ucygpLmdldChpbnRhbGxlZFZlcnNpb24pOwotICAgICAgICBpZiAoZGVmYXVsdEluc3RhbGwgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0SW5zdGFsbCksIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wb3NpdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IGdldFNlbGVjdGVkSW5zdGFsbCgpOwotICAgICAgICAvL2lmIChpc1VwZGF0ZVJlcXVpcmVkKHByb2plY3QsIHNlbGVjdGVkSW5zdGFsbCkpIHsKLSAgICAgICAgLy9pZiAoIWRlZmF1bHRJbnN0YWxsLmdldFZlcnNpb24oKS5lcXVhbHMoc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSkpIHsKLSAgICAgICAgaWYgKHNlbGVjdGVkSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDWEZSdW50aW1lVmVyc2lvbihwcm9qZWN0LCBzZWxlY3RlZEluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLQotICAgICAgICAgICAgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcigKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElQYXRoIGNvbnRhaW5lclBhdGggPSBuZXcgUGF0aChDWEZDb3JlUGx1Z2luLkNYRl9DTEFTU1BBVEhfQ09OVEFJTkVSX0lEKTsKLSAgICAgICAgICAgICAgICBDWEZDbGFzc3BhdGhDb250YWluZXIgY3hmQ2xhc3NwYXRoQ29udGFpbmVyID0gbmV3IENYRkNsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIucmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeGZDbGFzc3BhdGhDb250YWluZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgZ2V0U2VsZWN0ZWRJbnN0YWxsKCkgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBpZiAoIXN0cnVjdHVyZWRTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSW5zdGFsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0gICAgICAgIENYRkluc3RhbGwgZGVmYXVsdEluc3RhbGwgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS5nZXQoY29udGV4dC5nZXREZWZhdWx0UnVudGltZVZlcnNpb24oKSk7Ci0gICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRJbnN0YWxsKSwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL0phdmFWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0MDAwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9KYXZhVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci0KLS8qKgotICogPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPiB0aGF0IGZpbHRlcnMgb24gY2xhc3NlcyBvciBpbnRlcmZhY2VzIHdpdGhpbiBhIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVmlld2VyRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIHByaXZhdGUgaW50IGVsZW1lbnRLaW5kczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIDxjb2RlPkphdmFWaWV3ZXJGaWx0ZXI8L2NvZGU+IGdpdmVuIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbmQgYW4KLSAgICAgKiA8Y29kZT5JSmF2YVNlYXJjaENvbnN0YW50czwvY29kZT4gZWxlbWVudCBraW5kIHRvIHNlYXJjaCBmb3IuIEFsbCBvdGhlciBlbGVtZW50cyBhcmUgZmlsdGVyZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QgdG8gZmlsdGVyCi0gICAgICogQHBhcmFtIGVsZW1lbnRLaW5kcyBhIGZsYWcgZGVmaW5pbmcgbmF0dXJlIG9mIHNlYXJjaGVkIGVsZW1lbnRzOyB0aGUgb25seSB2YWxpZCB2YWx1ZXMgYXJlOiAKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgSmF2YVZpZXdlckZpbHRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGludCBlbGVtZW50S2luZHMpIHsKLSAgICAgICAgdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotICAgICAgICB0aGlzLmVsZW1lbnRLaW5kcyA9IGVsZW1lbnRLaW5kczsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0LmVxdWFscygoSUphdmFQcm9qZWN0KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OwotICAgICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5oYXNDaGlsZHJlbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuSU5URVJGQUNFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0ludGVyZmFjZSgpICYmICF0eXBlLmlzQW5ub3RhdGlvbigpOwotICAgICAgICAgICAgICAgIGNhc2UgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDbGFzcygpIHx8ICh0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGUuaXNBbm5vdGF0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBDWEZVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA2NzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuV1NETDJKYXZhRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotcHVibGljIGNsYXNzIFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBpbmNsdWRlZE5hbWVzcGFjZXM7Ci0KLSAgICBwdWJsaWMgUGFja2FnZU5hbWVDb2x1bW5MYWJlbFByb3ZpZGVyKFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShlbGVtZW50LnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZWROYW1lc3BhY2VzLmdldChlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXU0RMVXRpbHMuZ2V0UGFja2FnZU5hbWVGcm9tTmFtZXNwYWNlKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZUVkaXRpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjU3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3ZpZXdlcnMvUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS52aWV3ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5XU0RMVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVFZGl0aW5nU3VwcG9ydCBleHRlbmRzIEVkaXRpbmdTdXBwb3J0IGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotICAgIHByaXZhdGUgQ2VsbEVkaXRvciBwYWNrYWdlTmFtZUNlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5jbHVkZWROYW1lc3BhY2VzOwotCi0gICAgcHVibGljIFBhY2thZ2VOYW1lRWRpdGluZ1N1cHBvcnQoVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIENlbGxFZGl0b3IgcGFja2FnZU5hbWVDZWxsRWRpdG9yLAotICAgICAgICAgICAgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHN1cGVyKHRhYmxlVmlld2VyKTsKLSAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0gICAgICAgIHRoaXMucGFja2FnZU5hbWVDZWxsRWRpdG9yID0gcGFja2FnZU5hbWVDZWxsRWRpdG9yOwotICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMgPSBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKTsKLSAgICAgICAgdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdChPYmplY3QgZWxlbWVudCkgewotICAgICAgICByZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uKClbMF0uZ2V0Q2hlY2tlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lQ2VsbEVkaXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkoZWxlbWVudC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkTmFtZXNwYWNlcy5nZXQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShlbGVtZW50LnRvU3RyaW5nKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE9iamVjdCBuYW1lc3BhY2UsIE9iamVjdCBwYWNrYWdlTmFtZSkgewotICAgICAgICBpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgcGFja2FnZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5jbHVkZWROYW1lc3BhY2VzLnB1dChuYW1lc3BhY2UudG9TdHJpbmcoKSwgcGFja2FnZU5hbWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBnZXRWaWV3ZXIoKS51cGRhdGUobmFtZXNwYWNlLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pIGV2ZW50Lml0ZW07Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZXNwYWNlS2V5ID0gaXRlbS5nZXRUZXh0KDApOwotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaXRlbS5nZXRUZXh0KDEpOwotICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlZE5hbWVzcGFjZXMuY29udGFpbnNLZXkobmFtZXNwYWNlS2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZE5hbWVzcGFjZXMucHV0KG5hbWVzcGFjZUtleSwgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVkTmFtZXNwYWNlcy5jb250YWluc0tleShuYW1lc3BhY2VLZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkTmFtZXNwYWNlcy5yZW1vdmUobmFtZXNwYWNlS2V5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS92aWV3ZXJzL1BhY2thZ2VOYW1lVGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYjZlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvdmlld2Vycy9QYWNrYWdlTmFtZVRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotICAgICAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gKERlZmluaXRpb24pIGlucHV0RWxlbWVudDsKLSAgICAgICAgICAgIE1hcCBuYW1lc3BhY2VzID0gZGVmaW5pdGlvbi5nZXROYW1lc3BhY2VzKCk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIHZhbHVlcyA9IG5hbWVzcGFjZXMudmFsdWVzKCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBuYW1lc3BhY2VWYWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBuYW1lc3BhY2VWYWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZXNwYWNlLmVxdWFscyhkZWZpbml0aW9uLmdldFRhcmdldE5hbWVzcGFjZSgpKSAmJiAhZWxlbWVudHMuY29udGFpbnMobmFtZXNwYWNlKSkgewotICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQobmFtZXNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkobmV3IE9iamVjdFtlbGVtZW50cy5zaXplKCldKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0Fubm90YXRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjA5NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQW5ub3RhdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBwcml2YXRlIEphdmEyV1NQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLQotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGdlbmVyYXRlV2ViUGFyYW1CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGVuYWJsZUFQVEJ1dHRvbjsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGFkZENvbnRyb2xzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXQocHJlZmxheW91dCk7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgamF4d3NBbm5vdGF0aW9uc0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0FOTk9UQVRJT05TX0dST1VQX0xBQkVMKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfR1JPVVBfVE9PTFRJUCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBqYXh3c0Fubm90YXRpb25zR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgamF4d3NBbm5vdGF0aW9uc0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVhXU19HRU5FUkFURV9XRUJfTUVUSE9EKTsKLSAgICAgICAgZ2VuZXJhdGVXZWJNZXRob2RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVdlYlBhcmFtQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1dFQl9QQVJBTSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViUGFyYW1Bbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlV2ViUGFyYW1CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdlYlBhcmFtQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQnV0dG9uID0gbmV3IEJ1dHRvbihqYXh3c0Fubm90YXRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUik7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlUmVxdWVzdFdyYXBwZXJBbm5vdGF0aW9uKHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbmVyYXRlUmVxdWVzdFdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlcXVlc3RXcmFwcGVyQW5ub3RhdGlvbigpKTsKLQotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbiA9IG5ldyBCdXR0b24oamF4d3NBbm5vdGF0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfR0VORVJBVEVfUkVTUE9OU0VfV1JBUFBFUik7Ci0gICAgICAgIGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9ICgoQnV0dG9uKSBlLndpZGdldCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oc2VsZWN0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVJlc3BvbnNlV3JhcHBlckFubm90YXRpb24oKSk7Ci0KLSAgICAgICAgR3JvdXAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgYW5ub3RhdGlvblByb2Nlc3NpbmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFYV1NfQU5OT1RBVElPTlNfUFJPQ0VTU0lOR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuSkFYV1NfRU5BQkxFX0FOTk9UQVRJT05fUFJPQ0VTU0lOR19UT09MVElQLAotICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICBhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGFubm90YXRpb25Qcm9jZXNzaW5nR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZW5hYmxlQVBUQnV0dG9uID0gbmV3IEJ1dHRvbihhbm5vdGF0aW9uUHJvY2Vzc2luZ0dyb3VwLCBTV1QuQ0hFQ0spOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBWFdTX0VOQUJMRV9BTk5PVEFUSU9OX1BST0NFU1NJTkcpOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkID0gKChCdXR0b24pIGUud2lkZ2V0KS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEFubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZChzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGdlbmVyYXRlV2ViTWV0aG9kQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV0VCX01FVEhPRF9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1dFQl9QQVJBTV9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX0dFTkVSQVRFX1JFUVVFU1RfV1JBUFBFUl9BTk5PVEFUSU9OKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVSZXNwb25zZVdyYXBwZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9SRVNQT05TRV9XUkFQUEVSX0FOTk9UQVRJT04pKTsKLQotICAgICAgICBlbmFibGVBUFRCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19BTk5PVEFUSU9OX1BST0NFU1NJTkdfRU5BQkxFRCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlV2ViTWV0aG9kQW5ub3RhdGlvbihnZW5lcmF0ZVdlYk1ldGhvZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXZWJQYXJhbUFubm90YXRpb24oZ2VuZXJhdGVXZWJQYXJhbUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXF1ZXN0V3JhcHBlckFubm90YXRpb24oZ2VuZXJhdGVSZXF1ZXN0V3JhcHBlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVSZXNwb25zZVdyYXBwZXJBbm5vdGF0aW9uKGdlbmVyYXRlUmVzcG9uc2VXcmFwcGVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRBbm5vdGF0aW9uUHJvY2Vzc2luZ0VuYWJsZWQoZW5hYmxlQVBUQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvQmxhbmtSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlNDFmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9CbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIEJsYW5rUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICAgIHB1YmxpYyBCbGFua1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0KLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBDTGFiZWwgc2V0SW50YWxsRGlyTGFiZWwgPSBuZXcgQ0xhYmVsKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkNFTlRFUiwgU1dULkNFTlRFUiwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBzZXRJbnRhbGxEaXJMYWJlbC5zZXRJbWFnZShQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKAotICAgICAgICAgICAgICAgIElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKSk7Ci0gICAgICAgIHNldEludGFsbERpckxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIwV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZDljOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBDWEYyMFdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBXU0RMMkphdmFDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbjsKLQotICAgIHByaXZhdGUgVGFibGUgeGpjQXJnc1RhYmxlOwotCi0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNMb2NhdG9yVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtOwotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW07Ci0KLSAgICBwdWJsaWMgQ1hGMjBXU0RMMkphdmFQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgcHJlZmxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dChwcmVmbGF5b3V0KTsKLQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBHcm91cCB3c2RsMmphdmFHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgd3NkbDJqYXZhbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dCh3c2RsMmphdmFsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbigKLSAgICAgICAgICAgICAgICB3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIAotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLQotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbih3c2RsMmphdmFHcm91cCwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLQotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlTmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotCi0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmlzQXV0b05hbWVSZXNvbHV0aW9uUGVybWl0dGVkKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdyb3VwIHhqY0FyZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB4amNBcmdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfR1JPVVBfVElUTEUpOwotICAgICAgICBHcmlkTGF5b3V0IHhqY0FyZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotICAgICAgICB4amNBcmdHcm91cC5zZXRMYXlvdXQoeGpjQXJnTGF5b3V0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDQXJnVGFibGUoeGpjQXJnR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIGdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDY7Ci0gICAgICAgIHhqY0FyZ3NUYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNEZWZhdWx0VmFsdWVzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbSgKLSAgICAgICAgICAgICAgICB4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNTeW5jTWV0aG9kc1RhYmxlSXRlbSh4amNBcmdzVGFibGUsIGNvbnRleHQpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0KLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkNYRl9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuQ1hGX0NPTlRFWFRfX0dFTkVSQVRFX1NFUlZFUikpOwotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19HRU5FUkFURV9JTVBMRU1FTlRBVElPTikpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9OQU1FX01BUFBJTkcpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0xPQURfREVGQVVMVF9FWENMVURFU19OQU1FUFNBQ0VfTUFQUElORykpOwotCi0gICAgICAgIGlmIChjYW5VcGRhdGVBdXRvTmFtZVJlc29sdXRpb24oKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19BVVRPX05BTUVfUkVTT0xVVElPTikpOwotICAgICAgICB9Ci0KLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19UT19TVFJJTkcpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX1NJTVBMRSkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTE9DQVRPUikpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19NQVJLX0dFTkVSQVRFRCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlSW1wbGVtZW50YXRpb24oKSk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1Byb2Nlc3NTT0FQSGVhZGVycygpKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNMb2FkRGVmYXVsdE5hbWVzcGFjZVBhY2thZ2VOYW1lTWFwcGluZygpKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0F1dG9OYW1lUmVzb2x1dGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNVc2VEZWZhdWx0VmFsdWVzKCkpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmdNdWx0aUxpbmUoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nU2ltcGxlKCkpOwotICAgICAgICB4amNMb2NhdG9yVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY0xvY2F0b3IoKSk7Ci0gICAgICAgIHhqY1N5bmNNZXRob2RzVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1N5bmNNZXRob2RzKCkpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY01hcmtHZW5lcmF0ZWQoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBjb250ZXh0LnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNvbnRleHQuc2V0WGpjVXNlRGVmYXVsdFZhbHVlcyh4amNEZWZhdWx0VmFsdWVzVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmcoeGpjVG9TdHJpbmdUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZ011bHRpTGluZSh4amNUb1N0cmluZ011bHRpTGluZVRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nU2ltcGxlKHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjTG9jYXRvcih4amNMb2NhdG9yVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjU3luY01ldGhvZHMoeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNNYXJrR2VuZXJhdGVkKHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiAhPSBudWxsICYmIENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0NYRjIxV1NETDJKYXZhUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyY2IzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9DWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLldTREwySmF2YUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLXB1YmxpYyBjbGFzcyBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLSAgICBXU0RMMkphdmFDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXU0RMMkphdmFDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0KLSAgICBwcml2YXRlIFRhYmxlIHhqY0FyZ3NUYWJsZTsKLQotICAgIHByaXZhdGUgVGFibGVJdGVtIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW07Ci0gICAgcHJpdmF0ZSBUYWJsZUl0ZW0geGpjTG9jYXRvclRhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbTsKLSAgICBwcml2YXRlIFRhYmxlSXRlbSB4amNNYXJrR2VuZXJhdGVkVGFibGVJdGVtOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBub0FkZHJlc3NCaW5kaW5nQnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbjsKLQotICAgIHB1YmxpYyBDWEYyMVdTREwySmF2YVByZWZlcmVuY2VzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHdzZGwyamF2YUdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICB3c2RsMmphdmFHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCB3c2RsMmphdmFsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIHdzZGwyamF2YUdyb3VwLnNldExheW91dCh3c2RsMmphdmFsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgd3NkbDJqYXZhR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gRnJvbnRlbmQKLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVGcm9udGVuZExhYmVsKHdzZGwyamF2YUdyb3VwKTsKLSAgICAgICAgLy8gQ29tYm8gZnJvbnRlbmRDb21ibyA9Ci0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRnJvbnRlbmRDb21ibyh3c2RsMmphdmFHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIC8vIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAvLyBmcm9udGVuZENvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIERhdGFiaW5kaW5nCi0gICAgICAgIC8vIFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlRGF0YWJpbmRpbmdMYWJlbCh3c2RsMmphdmFHcm91cCk7Ci0gICAgICAgIC8vIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPQotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZURhdGFiaW5kaW5nQ29tYm8od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgIC8vIGNvbnRleHQpOwotICAgICAgICAvLyBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gZGF0YWJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBXU0RMIFZlcnNpb24KLSAgICAgICAgLy8gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS4gY3JlYXRlV1NETFZlcnNpb25MYWJlbCh3c2RsMmphdmFHcm91cCk7Ci0gICAgICAgIC8vIENvbWJvIHdzZGxWZXJzaW9uQ29tYm8gPQotICAgICAgICAvLyBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVdTRExWZXJzaW9uQ29tYm8od3NkbDJqYXZhR3JvdXAsCi0gICAgICAgIC8vIGNvbnRleHQpOwotICAgICAgICAvLyBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgLy8gd3NkbFZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBnZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVEZWZhdWx0VmFsdWVzQnV0dG9uKHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgCi0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKHdzZGwyamF2YUdyb3VwLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKAotICAgICAgICAgICAgICAgIHdzZGwyamF2YUdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oCi0gICAgICAgICAgICAgICAgd3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaWYgKENYRk1vZGVsVXRpbHMuaXNBdXRvTmFtZVJlc29sdXRpb25QZXJtaXR0ZWQoKSkgewotICAgICAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVBdXRvTmFtZVJlc29sdXRpb25CdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZU5vQWRkcmVzc0JpbmRpbmdCdXR0b24od3NkbDJqYXZhR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgR3JvdXAgeGpjQXJnR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULlNIQURPV19JTik7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0FSR19HUk9VUF9USVRMRSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgeGpjQXJnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHhqY0FyZ0dyb3VwLnNldExheW91dCh4amNBcmdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgeGpjQXJnR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgeGpjQXJnc1RhYmxlID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNBcmdUYWJsZSh4amNBcmdHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLSAgICAgICAgZ3JpZERhdGEudmVydGljYWxTcGFuID0gNjsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbSA9IFdTREwySmF2YVdpZGdldEZhY3RvcnkuY3JlYXRlWEpDVG9TdHJpbmdUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKAotICAgICAgICAgICAgICAgIHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtID0gV1NETDJKYXZhV2lkZ2V0RmFjdG9yeS5jcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbSh4amNBcmdzVGFibGUsCi0gICAgICAgICAgICAgICAgY29udGV4dCk7Ci0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ0xvY2F0b3JUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBjb250ZXh0KTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgY29udGV4dCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0gPSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5LmNyZWF0ZVhKQ01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLAotICAgICAgICAgICAgICAgIGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19VU0VfREVGQVVMVF9WQUxVRVMpKTsKLSAgICAgICAgCi0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX05PX0FERFJFU1NfQklORElORykpOwotCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5DWEZfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkNYRl9DT05URVhUX19HRU5FUkFURV9TRVJWRVIpKTsKLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1BST0NFU1NfU09BUF9IRUFERVJTKSk7Ci0gICAgICAgIAotICAgICAgICBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19MT0FEX0RFRkFVTFRfTkFNRVNQQUNFX1BBQ0tBR0VfTkFNRV9NQVBQSU5HKSk7Ci0gICAgICAgIAotICAgICAgICBleGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fTE9BRF9ERUZBVUxUX0VYQ0xVREVTX05BTUVQU0FDRV9NQVBQSU5HKSk7Ci0KLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX0FVVE9fTkFNRV9SRVNPTFVUSU9OKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVVNFX0RFRkFVTFRfVkFMVUVTKSk7Ci0gICAgICAgIAotICAgICAgICB4amNUb1N0cmluZ1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklORykpOwotICAgICAgICAKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfVE9fU1RSSU5HX01VTFRJX0xJTkUpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlVGFibGVJdGVtLnNldENoZWNrZWQoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhULCBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVF9fWEpDX1RPX1NUUklOR19TSU1QTEUpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY0xvY2F0b3JUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19MT0NBVE9SKSk7Ci0gICAgICAgIAotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLldTREwyX0pBVkFfQ09OVEVYVCwgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFRfX1hKQ19TWU5DX01FVEhPRFMpKTsKLSAgICAgICAgCi0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRUYWJsZUl0ZW0uc2V0Q2hlY2tlZChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5XU0RMMl9KQVZBX0NPTlRFWFQsIENYRlBhY2thZ2UuV1NETDJfSkFWQV9DT05URVhUX19YSkNfTUFSS19HRU5FUkFURUQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNOb0FkZHJlc3NCaW5kaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGNhblVwZGF0ZUF1dG9OYW1lUmVzb2x1dGlvbigpKSB7Ci0gICAgICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNBdXRvTmFtZVJlc29sdXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGdlbmVyYXRlU2VydmVyQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVTZXJ2ZXIoKSk7Ci0gICAgICAgIGdlbmVyYXRlSW1wbGVtZW50YXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZUltcGxlbWVudGF0aW9uKCkpOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNQcm9jZXNzU09BUEhlYWRlcnMoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0xvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKCkpOwotCi0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVXNlRGVmYXVsdFZhbHVlcygpKTsKLSAgICAgICAgeGpjVG9TdHJpbmdUYWJsZUl0ZW0uc2V0Q2hlY2tlZChjb250ZXh0LmlzWGpjVG9TdHJpbmcoKSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLnNldENoZWNrZWQoY29udGV4dC5pc1hqY1RvU3RyaW5nTXVsdGlMaW5lKCkpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgeGpjTG9jYXRvclRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNMb2NhdG9yKCkpOwotICAgICAgICB4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5zZXRDaGVja2VkKGNvbnRleHQuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzdG9yZVZhbHVlcygpIHsKLSAgICAgICAgY29udGV4dC5zZXRVc2VEZWZhdWx0VmFsdWVzKHVzZURlZmF1bHRWYWx1ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldE5vQWRkcmVzc0JpbmRpbmcobm9BZGRyZXNzQmluZGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuZXJhdGVTZXJ2ZXJCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlSW1wbGVtZW50YXRpb24oZ2VuZXJhdGVJbXBsZW1lbnRhdGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldExvYWREZWZhdWx0RXhjbHVkZXNOYW1lcHNhY2VNYXBwaW5nKGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLSAgICAgICAgY29udGV4dC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKHhqY0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNUb1N0cmluZyh4amNUb1N0cmluZ1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKHhqY1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtLmdldENoZWNrZWQoKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0WGpjVG9TdHJpbmdTaW1wbGUoeGpjVG9TdHJpbmdTaW1wbGVUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNMb2NhdG9yKHhqY0xvY2F0b3JUYWJsZUl0ZW0uZ2V0Q2hlY2tlZCgpKTsKLSAgICAgICAgY29udGV4dC5zZXRYamNTeW5jTWV0aG9kcyh4amNTeW5jTWV0aG9kc1RhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgICAgICBjb250ZXh0LnNldFhqY01hcmtHZW5lcmF0ZWQoeGpjTWFya0dlbmVyYXRlZFRhYmxlSXRlbS5nZXRDaGVja2VkKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuVXBkYXRlQXV0b05hbWVSZXNvbHV0aW9uKCkgewotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uICE9IG51bGwgJiYgQ1hGTW9kZWxVdGlscy5pc0F1dG9OYW1lUmVzb2x1dGlvblBlcm1pdHRlZCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU0RMUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiNWVhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuY29udGV4dC5KYXZhMldTUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLQotcHVibGljIGNsYXNzIEphdmEyV1NETFJ1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0KLSAgICBwcml2YXRlIENvbWJvIHNvYXBCaW5kaW5nQ29tYm87Ci0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlWFNESW1wb3J0c0J1dHRvbjsgICAgCi0gICAgcHJpdmF0ZSBUYWJGb2xkZXIgdGFiRm9sZGVyOwotICAgIAotICAgIHB1YmxpYyBKYXZhMldTRExSdW50aW1lUHJlZmVyZW5jZXNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBUYWJGb2xkZXIgdGFiRm9sZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICB0aGlzLnRhYkZvbGRlciA9IHRhYkZvbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGphdmEyd3NkbEdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBqYXZhMndzZGxHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU0RMX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgamF2YTJ3c2xheW91dC5udW1Db2x1bW5zID0gMjsKLSAgICAgICAgamF2YTJ3c2RsR3JvdXAuc2V0TGF5b3V0KGphdmEyd3NsYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgamF2YTJ3c2RsR3JvdXAuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlU09BUEJpbmRpbmdMYWJlbChqYXZhMndzZGxHcm91cCk7Ci0KLSAgICAgICAgc29hcEJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5nQ29tYm8oamF2YTJ3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVYU0RJbXBvcnRzQnV0dG9uKGphdmEyd3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAKLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsodGhpcywgU1dULk5PTkUpOwotICAgICAgICBsaW5rLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19QUkVGRVJFTkNFU19MSU5LKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKDMpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewotICAgICAgICBpZiAoQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVCwKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFRfX1NPQVAxMl9CSU5ESU5HKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4xIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotCi0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZShDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhUX19HRU5FUkFURV9YU0RfSU1QT1JUUykpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlWFNESW1wb3J0cygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0NvbWJvLmdldFRleHQoKS5lcXVhbHMoIlNPQVAgMS4yIikpIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cyhjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9KYXZhMldTUnVudGltZVByZWZlcmVuY2VzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjJmZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5jb250ZXh0LkphdmEyV1NQZXJzaXN0ZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUudXRpbHMuQ1hGTW9kZWxVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBKYXZhMldTUGVyc2lzdGVudENvbnRleHQgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7Ci0gICAgCi0gICAgcHJpdmF0ZSBDb21ibyBzb2FwQmluZGluZ0NvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHNCdXR0b247Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZUNsaWVudEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVNlcnZlckJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b247Ci0gICAgcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVXU0RMQnV0dG9uOwotICAgIAotICAgIHByaXZhdGUgVGFiRm9sZGVyIHRhYkZvbGRlcjsKLSAgICAKLSAgICBwdWJsaWMgSmF2YTJXU1J1bnRpbWVQcmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFRhYkZvbGRlciB0YWJGb2xkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIHRoaXMudGFiRm9sZGVyID0gdGFiRm9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRyb2xzKCkgewotICAgICAgICBHcmlkTGF5b3V0IHByZWZsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0gICAgICAgIHByZWZsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIHByZWZsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgdGhpcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBKYXZhMldTIEdyb3VwCi0gICAgICAgIEdyb3VwIGphdmEyd3NHcm91cCA9IG5ldyBHcm91cCh0aGlzLCBTV1QuU0hBRE9XX0lOKTsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dST1VQX0xBQkVMKTsKLSAgICAgICAgR3JpZExheW91dCBqYXZhMndzbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQotICAgICAgICBqYXZhMndzbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0gICAgICAgIGphdmEyd3NsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0gICAgICAgIGphdmEyd3NHcm91cC5zZXRMYXlvdXQoamF2YTJ3c2xheW91dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgamF2YTJ3c0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIC8vIEZyb250ZW5kCi0gICAgICAgIEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kTGFiZWwoamF2YTJ3c0dyb3VwKTsKLSAgICAgICAgQ29tYm8gZnJvbnRlbmRDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUZyb250ZW5kQ29tYm8oamF2YTJ3c0dyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAvLyBEYXRhYmluZGluZwotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0xhYmVsKGphdmEyd3NHcm91cCk7Ci0gICAgICAgIENvbWJvIGRhdGFiaW5kaW5nQ29tYm8gPSBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVEYXRhYmluZGluZ0NvbWJvKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgLy8gR2VuIENsaWVudAotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFNlcnZlcgotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbiA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFdyYXBwZXIgYW5kIEZhdWx0IEJlYW4KLSAgICAgICAgZ2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFuQnV0dG9uKAotICAgICAgICAgICAgICAgIGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0KLSAgICAgICAgLy8gR2VuIFdTREwKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlR2VuZXJhdGVXU0RMQnV0dG9uKGphdmEyd3NHcm91cCwgY29udGV4dCk7Ci0gICAgICAgIGdlbmVyYXRlV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVXU0RMR3JvdXAoZ2VuZXJhdGVXU0RMQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgR3JvdXAgd3NkbEdyb3VwID0gbmV3IEdyb3VwKGphdmEyd3NHcm91cCwgU1dULlNIQURPV19FVENIRURfSU4pOwotICAgICAgICBHcmlkTGF5b3V0IHdzZGxHcm91cExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgd3NkbEdyb3VwLnNldExheW91dCh3c2RsR3JvdXBMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgIHdzZGxHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBKYXZhMldTV2lkZ2V0RmFjdG9yeS5jcmVhdGVTT0FQQmluZGluZ0xhYmVsKHdzZGxHcm91cCk7Ci0KLSAgICAgICAgc29hcEJpbmRpbmdDb21ibyA9IEphdmEyV1NXaWRnZXRGYWN0b3J5LmNyZWF0ZVNPQVBCaW5nQ29tYm8od3NkbEdyb3VwLCBjb250ZXh0KTsKLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uID0gSmF2YTJXU1dpZGdldEZhY3RvcnkuY3JlYXRlWFNESW1wb3J0c0J1dHRvbih3c2RsR3JvdXAsIGNvbnRleHQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHNCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgIAotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayh0aGlzLCBTV1QuTk9ORSk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1BSRUZFUkVOQ0VTX0xJTkspOwotICAgICAgICBsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHRhYkZvbGRlci5zZXRTZWxlY3Rpb24oMyk7IAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZW5hYmxlV1NETEdyb3VwKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlV1NETEdyb3VwKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0gICAgICAgIGlmIChDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fU09BUDEyX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICBzb2FwQmluZGluZ0NvbWJvLnNldFRleHQoIlNPQVAgMS4yIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfWFNEX0lNUE9SVFMpKTsKLQotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfQ0xJRU5UKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fR0VORVJBVEVfU0VSVkVSKSk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24uc2V0U2VsZWN0aW9uKENYRk1vZGVsVXRpbHMuZ2V0RGVmYXVsdEJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICBDWEZQYWNrYWdlLkpBVkEyX1dTX0NPTlRFWFQsIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1JBUFBFUl9GQVVMVF9CRUFOUykpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdGVXU0RMQnV0dG9uLnNldFNlbGVjdGlvbihDWEZNb2RlbFV0aWxzLmdldERlZmF1bHRCb29sZWFuVmFsdWUoQ1hGUGFja2FnZS5KQVZBMl9XU19DT05URVhULAotICAgICAgICAgICAgICAgIENYRlBhY2thZ2UuSkFWQTJfV1NfQ09OVEVYVF9fR0VORVJBVEVfV1NETCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotICAgICAgICBpZiAoY29udGV4dC5pc1NvYXAxMkJpbmRpbmcoKSkgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMiIpOyAvLyROT04tTkxTLTEkICAgIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVYU0RJbXBvcnRzKCkpOwotICAgICAgICBnZW5lcmF0ZUNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICBnZW5lcmF0ZVNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlU2VydmVyKCkpOwotICAgICAgICBnZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKCkpOwotICAgICAgICBnZW5lcmF0ZVdTRExCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVdTREwoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3JlVmFsdWVzKCkgewotICAgICAgICBpZiAoc29hcEJpbmRpbmdDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJTT0FQIDEuMiIpKSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZXh0LnNldFNvYXAxMkJpbmRpbmcoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVhTREltcG9ydHMoY3JlYXRlWFNESW1wb3J0c0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVDbGllbnQoZ2VuZXJhdGVDbGllbnRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlbmVyYXRlU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgY29udGV4dC5zZXRHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5zKGdlbmVyYXRlV3JhcHBlckZhdWx0QmVhbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXU0RMKGdlbmVyYXRlV1NETEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL0phdmEyV1NXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNGNjYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpZGdldHMvSmF2YTJXU1dpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuRGF0YUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkZyb250ZW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5KYXZhMldTQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuSmF2YTJXU0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLnZpZXdlcnMuSmF2YVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgd2lkZ2V0cyBmb3IgSmF2YTJXUyBwcmVmZXJlbmNlcywgd2l6YXJkcywgZGlhbG9ncy4gRW5hYmxlcyB0aGUgcmV1c2UKLSAqIG9mIHdpZGdldHMgaW4gbXVsdGlwbGUgbG9jYXRpb25zLiBXaWRnZXRzIGhhdmUgdGhlcmUgbGFiZWxpbmcgYW5kIHRvb2x0aXBzCi0gKiBzZXQgaGVyZSBhbmQgd2hlcmUgcG9zc2libGUgbGlzdGVuZXJzIGFyZSBzZXQgd2hpY2ggdXBkYXRlIGluc3RhbmNlcyBvZgotICogPGNvZGU+SmF2YTJXU0NvbnRleHQ8L2NvZGU+IGFuZCA8Y29kZT5KYXZhMldTRGF0YU1vZGVsPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YTJXU1dpZGdldEZhY3RvcnkgewotCi0gICAgcHJpdmF0ZSBKYXZhMldTV2lkZ2V0RmFjdG9yeSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNPQVBCaW5kaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBkZWZhdWx0U29hcEJpbmRpbmcgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGRlZmF1bHRTb2FwQmluZGluZy5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19ERUZBVUxUX1NPQVBCSU5ESU5HX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGRlZmF1bHRTb2FwQmluZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNPQVBCaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBDb21ibyBzb2FwQmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NPQVAxMl9CSU5ESU5HX1RPT0xUSVApOwotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZCgiU09BUCAxLjEiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzb2FwQmluZGluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHNvYXBCaW5kaW5nID0gKChDb21ibykgZS53aWRnZXQpLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcuZXF1YWxzKCJTT0FQIDEuMiIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRTb2FwMTJCaW5kaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0U29hcDEyQmluZGluZyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaWYgKGNvbnRleHQuaXNTb2FwMTJCaW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHNvYXBCaW5kaW5nQ29tYm8uc2V0VGV4dCgiU09BUCAxLjIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc29hcEJpbmRpbmdDb21iby5zZXRUZXh0KCJTT0FQIDEuMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc29hcEJpbmRpbmdDb21ibzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVYU0RJbXBvcnRzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgQnV0dG9uIGNyZWF0ZVhTREltcG9ydHMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgY3JlYXRlWFNESW1wb3J0cy5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fWFNEX0lNUE9SVFMpOwotICAgICAgICBjcmVhdGVYU0RJbXBvcnRzLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19DUkVBVEVfWFNEX0lNUE9SVFNfVE9PTFRJUCk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlWFNESW1wb3J0cygoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGNyZWF0ZVhTREltcG9ydHMuc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVhTREltcG9ydHMoKSk7Ci0gICAgICAgIHJldHVybiBjcmVhdGVYU0RJbXBvcnRzOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRnJvbnRlbmRMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGZyb250ZW5kTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGZyb250ZW5kTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0ZST05URU5EX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVGcm9udGVuZENvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZnJvbnRlbmRDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19GUk9OVEVORF9UT09MVElQKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGQoRnJvbnRlbmQuSkFYV1MuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmcm9udGVuZCA9IGZyb250ZW5kQ29tYm8uZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RnJvbnRlbmQoRnJvbnRlbmQuZ2V0KGZyb250ZW5kKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb250ZW5kLmVxdWFscyhGcm9udGVuZC5KQVhXUy5nZXRMaXRlcmFsKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoRGF0YUJpbmRpbmcuZ2V0KERhdGFCaW5kaW5nLkpBWEIuZ2V0TGl0ZXJhbCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChmcm9udGVuZC5lcXVhbHMoInNpbXBsZSIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RGF0YWJpbmRpbmcoImFlZ2lzIik7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUZXh0KGNvbnRleHQuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotCi0gICAgICAgIHJldHVybiBmcm9udGVuZENvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlRGF0YWJpbmRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIGRhdGFiaW5kaW5nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9ERUZBVUxUX0RBVEFCSU5ESU5HX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVEYXRhYmluZGluZ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gZGF0YWJpbmRpbmdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19EQVRBQklORElOR19UT09MVElQKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5hZGQoRGF0YUJpbmRpbmcuSkFYQi5nZXRMaXRlcmFsKCkpOwotICAgICAgICBkYXRhYmluZGluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5zZXREYXRhYmluZGluZyhEYXRhQmluZGluZy5nZXQoZGF0YWJpbmRpbmdDb21iby5nZXRUZXh0KCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VGV4dChjb250ZXh0LmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgcmV0dXJuIGRhdGFiaW5kaW5nQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVDbGllbnRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuQ2xpZW50QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fQ0xJRU5UX0xBQkVMKTsKLSAgICAgICAgZ2VuQ2xpZW50QnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5FUkFURV9DTElFTlRfVE9PTFRJUCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVDbGllbnQoZ2VuQ2xpZW50QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlQ2xpZW50KCkpOwotICAgICAgICByZXR1cm4gZ2VuQ2xpZW50QnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlU2VydmVyQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlblNlcnZlckJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX1NFUlZFUl9MQUJFTCk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfU0VSVkVSX1RPT0xUSVApOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEdlbmVyYXRlU2VydmVyKGdlblNlcnZlckJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5TZXJ2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGNvbnRleHQuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgcmV0dXJuIGdlblNlcnZlckJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVdyYXBwZXJGYXVsdEJlYW5CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuV3JhcHBlckZhdWx0QnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fV1JBUFBFUl9GQVVMVF9MQUJFTCk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfV1JBUFBFUkJFQU5fVE9PTFRJUCk7Ci0gICAgICAgIGdlbldyYXBwZXJGYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucyhnZW5XcmFwcGVyRmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuV3JhcHBlckZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbihjb250ZXh0LmlzR2VuZXJhdGVXcmFwcGVyRmF1bHRCZWFucygpKTsKLSAgICAgICAgcmV0dXJuIGdlbldyYXBwZXJGYXVsdEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZVdTRExCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgSmF2YTJXU0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuV1NETEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5XU0RMQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0dFTl9XU0RMX0xBQkVMKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VORVJBVEVfV1NETF9UT09MVElQKTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0R2VuZXJhdGVXU0RMKGdlbldTRExCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZ2VuV1NETEJ1dHRvbi5zZXRTZWxlY3Rpb24oY29udGV4dC5pc0dlbmVyYXRlV1NETCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbldTRExCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVXU0RMRmlsZU5hbWVMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHdzZGxGaWxlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICB3c2RsRmlsZU5hbWVMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19XU0RMX0ZJTEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiB3c2RsRmlsZU5hbWVMYWJlbDsKLQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVXU0RMRmlsZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgVGV4dCB3c2RsRmlsZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIpOwotICAgICAgICB3c2RsRmlsZVRleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX09VVFBVVF9GSUxFX1RPT0xUSVApOwotICAgICAgICB3c2RsRmlsZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0V3NkbEZpbGVOYW1lKHdzZGxGaWxlVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgd3NkbEZpbGVUZXh0LnNldFRleHQobW9kZWwuZ2V0V3NkbEZpbGVOYW1lKCkpOwotICAgICAgICByZXR1cm4gd3NkbEZpbGVUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVVzZVNFSUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiB1c2VTRUlCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgdXNlU0VJQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1VTRV9TRUlfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIHVzZVNFSUJ1dHRvbjsKLSAgICB9Ci0KLSAgICAvLyAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUluZm9ybWF0aW9uTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgSVR5cGUgc3RhcnRpbmdQb2ludFR5cGUpIHsKLSAgICAvLyAgICAgICAgTGFiZWwgaW5mb0xhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotICAgIC8vICAgICAgICBpbmZvTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1VTRV9TRUlfSU5GT19MQUJFTCwgc3RhcnRpbmdQb2ludFR5cGUKLSAgICAvLyAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgIC8vICAgICAgICByZXR1cm4gaW5mb0xhYmVsOwotICAgIC8vICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlUGFkZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVTZWxlY3RTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gc2VsZWN0U0VJQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0gICAgICAgIHNlbGVjdFNFSUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdFNFSUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlbGVjdFNFSUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VsZWN0U0VJTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHNlbGVjdFNFSUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9TRUlfTEFCRUwpOwotICAgICAgICByZXR1cm4gc2VsZWN0U0VJTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVTZWxlY3RTRUlDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBKYXZhMldTRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgSVR5cGUgamF2YVN0YXJ0aW5nUG9pbnRUeXBlKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIHNlaUNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlaUNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfU0VJX1RPT0xUSVApOwotCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KG1vZGVsLmdldFByb2plY3ROYW1lKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVR5cGVIaWVyYXJjaHkgdHlwZUhpZXJhcmNoeSA9IGphdmFTdGFydGluZ1BvaW50VHlwZS5uZXdUeXBlSGllcmFyY2h5KGphdmFQcm9qZWN0LCBudWxsKTsKLSAgICAgICAgICAgIElUeXBlW10gYWxsSW50ZXJmYWNlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgaXR5cGUgPSBhbGxJbnRlcmZhY2VzW2ldOwotICAgICAgICAgICAgICAgIGlmICghaXR5cGUuaXNCaW5hcnkoKSAmJiBpdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKS5lcXVhbHMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZWlDb21iby5hZGQoaXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWlDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VpSW50ZXJmYWNlTmFtZSA9IHNlaUNvbWJvLmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRGdWxseVF1YWxpZmllZEphdmFJbnRlcmZhY2VOYW1lKHNlaUludGVyZmFjZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBzZWlDb21iby5kZXNlbGVjdEFsbCgpOwotICAgICAgICByZXR1cm4gc2VpQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19CUk9XU0VfTEFCRUwpOwotICAgICAgICByZXR1cm4gYnJvd3NlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUV4dHJhY3RTRUlCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gZXh0cmFjdFNFSUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotICAgICAgICBleHRyYWN0U0VJQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfU0VJX0xBQkVMKTsKLSAgICAgICAgcmV0dXJuIGV4dHJhY3RTRUlCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVFeHRyYWN0U0VJTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBleHRyYWN0U0VJTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGV4dHJhY3RTRUlMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBleHRyYWN0U0VJTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVNFSUludGVyZmFjZU5hbWVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgVGV4dCBzZWlJbnRlcmZhY2VOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlaUludGVyZmFjZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19FWFRSQUNUX1NFSV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHNlaUludGVyZmFjZU5hbWVUZXh0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTWVtZWJlcnNUb0V4dHJhY3RMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHNlaU1lbWJlcnNUb0V4dHJhY3RMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VpTWVtYmVyc1RvRXh0cmFjdExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0VYVFJBQ1RfTUVNQkVSU19MQUJFTCk7Ci0gICAgICAgIHJldHVybiBzZWlNZW1iZXJzVG9FeHRyYWN0TGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZVNFSU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENoZWNrYm94VGFibGVWaWV3ZXIgc2VpTWVtYmVyc1RvRXh0cmFjdFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocGFyZW50LAotICAgICAgICAgICAgICAgIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCkpOwotICAgICAgICBzZWlNZW1iZXJzVG9FeHRyYWN0VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgcmV0dXJuIHNlaU1lbWJlcnNUb0V4dHJhY3RUYWJsZVZpZXdlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVTZWxlY3RBbGxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBCdXR0b24gc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9BTExfQlVUVE9OKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEFsbEJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVEZXNlbGVjdEFsbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGRlc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX0RFU0VMRUNUX0FMTF9CVVRUT04pOwotICAgICAgICByZXR1cm4gZGVzZWxlY3RBbGxCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVTZWxlY3RJbXBsZW1lbnRhdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19TRUxFQ1RfSU1QTEVNRU5UQVRJT04pOwotICAgICAgICByZXR1cm4gc2VsZWN0SW1wbGVtZW50YXRpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIGZpbmFsIEphdmEyV1NEYXRhTW9kZWwgbW9kZWwsIElUeXBlIGphdmFTdGFydGluZ1BvaW50VHlwZSkgewotICAgICAgICBmaW5hbCBDb21ibyBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5KQVZBMldTX1NFTEVDVF9JTVBMRU1FTlRBVElPTl9UT09MVElQKTsKLQotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChtb2RlbC5nZXRQcm9qZWN0TmFtZSgpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBqYXZhU3RhcnRpbmdQb2ludFR5cGUubmV3VHlwZUhpZXJhcmNoeShqYXZhUHJvamVjdCwgbnVsbCk7Ci0gICAgICAgICAgICBJVHlwZVtdIGFsbEltcGxlbWVudGF0aW9ucyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXMoamF2YVN0YXJ0aW5nUG9pbnRUeXBlKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW1wbGVtZW50YXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSVR5cGUgaXR5cGUgPSBhbGxJbXBsZW1lbnRhdGlvbnNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCFpdHlwZS5pc0JpbmFyeSgpICYmIGl0eXBlLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmVxdWFscyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGl0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHBhY2thZ2VOYW1lICsgaXR5cGUuZ2V0UHJpbWFyeUVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RJbXBsZW1lbnRhdGlvbkNvbWJvLmFkZChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaW1wbGVtZW50YXRpb25OYW1lID0gc2VsZWN0SW1wbGVtZW50YXRpb25Db21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0RnVsbHlRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKGltcGxlbWVudGF0aW9uTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdEltcGxlbWVudGF0aW9uQ29tYm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiA8Y29kZT5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzwvY29kZT4gdGhhdCBkaXNwbGF5cyBhbGwgdGhlIGNsYXNzZXMgb3IgYWxsIHRoZSBpbnRlcmZhY2VzCi0gICAgICogd2l0aGluIGEgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPiBhbGxvd2luZyBvbmUgY2xhc3Mgb3IgaW50ZXJmYWNlIHRvIGJlIHNlbGVjdGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAotICAgICAqIEBwYXJhbSB0aXRsZSB0aGUgZGlhbG9nIHRpdGxlCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRpYWxvZyBtZXNzYWdlCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QgdGhhdCBpcyBmaWx0ZXJlZAotICAgICAqIEBwYXJhbSBlbGVtZW50S2luZHMgYSBmbGFnIGRlZmluaW5nIG5hdHVyZSBvZiBzZWFyY2hlZCBlbGVtZW50czsgdGhlIG9ubHkgdmFsaWQgdmFsdWVzIGFyZToKLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1M8L2NvZGU+Ci0gICAgICogIDxjb2RlPklKYXZhU2VhcmNoQ29uc3RhbnRzLklOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAgPGNvZGU+SUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1NfQU5EX0lOVEVSRkFDRTwvY29kZT4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IHRyZWUgc2VsZWN0aW9uIGRpYWxvZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgY3JlYXRlRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsCi0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBpbnQgZWxlbWVudEtpbmRzKSB7Ci0gICAgICAgIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhwYXJlbnQsCi0gICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHNlbGVjdGlvbkRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLmFkZEZpbHRlcihuZXcgSmF2YVZpZXdlckZpbHRlcihqYXZhUHJvamVjdCwgZWxlbWVudEtpbmRzKSk7Ci0KLSAgICAgICAgc2VsZWN0aW9uRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gc2VsZWN0aW9uRGlhbG9nOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9TcHJpbmdDb25maWdDb21wb3NpdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1NwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQzNThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1NwcmluZ0NvbmZpZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkNYRk1vZGVsVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIFNwcmluZ0NvbmZpZ0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGNvbnRleHQgPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gdXNlQ1hGU2VydmxldEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uOwotICAgIAotICAgIHB1YmxpYyBTcHJpbmdDb25maWdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9scygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDb250cm9scygpIHsKLSAgICAgICAgR3JpZExheW91dCBwcmVmbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KHByZWZsYXlvdXQpOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIHNwcmluZ0NvbmZpZ0dyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19HUk9VUF9MQUJFTCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgc3ByaW5nQ29uZmlnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSk7Ci0gICAgICAgIHNwcmluZ0NvbmZpZ0dyb3VwLnNldExheW91dChzcHJpbmdDb25maWdMYXlvdXQpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBzcHJpbmdDb25maWdHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uID0gbmV3IEJ1dHRvbihzcHJpbmdDb25maWdHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgdXNlQ1hGU2VydmxldEJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuU1BSSU5HX0NPTkZJR19VU0VfQ1hGX1NFUlZMRVQpOwotICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KCFzZWxlY3RlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24gPSBuZXcgQnV0dG9uKHNwcmluZ0NvbmZpZ0dyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uCi0gICAgICAgICAgICAgICAgLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5TUFJJTkdfQ09ORklHX1VTRV9DWEZfU1BSSU5HX0FQUExJQ0FUSU9OX0NPTlRFWFQpOwotICAgICAgICB1c2VTcHJpbmdBcHBDb250ZXh0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWQgPSAoKEJ1dHRvbikgZS53aWRnZXQpLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KHNlbGVjdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQuaXNVc2VTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHQoKSkgewotICAgICAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2VDWEZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKLSAgICAgICAgYm9vbGVhbiB1c2VTcHJpbmdBcHBjb250ZXh0ID0gQ1hGTW9kZWxVdGlscy5nZXREZWZhdWx0Qm9vbGVhblZhbHVlKENYRlBhY2thZ2UuQ1hGX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgQ1hGUGFja2FnZS5DWEZfQ09OVEVYVF9fVVNFX1NQUklOR19BUFBMSUNBVElPTl9DT05URVhUKTsKLSAgICAgICAgdXNlU3ByaW5nQXBwQ29udGV4dEJ1dHRvbi5zZXRTZWxlY3Rpb24odXNlU3ByaW5nQXBwY29udGV4dCk7Ci0gICAgICAgIHVzZUNYRlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKCF1c2VTcHJpbmdBcHBjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0gICAgICAgIGNvbnRleHQuc2V0VXNlU3ByaW5nQXBwbGljYXRpb25Db250ZXh0KHVzZVNwcmluZ0FwcENvbnRleHRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1dTREwySmF2YVdpZGdldEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aWRnZXRzL1dTREwySmF2YVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0Y2FjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2lkZ2V0cy9XU0RMMkphdmFXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBqYXZheC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5XU0RMMkphdmFEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5kaWFsb2dzLlJlc291cmNlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkudmlld2Vycy5QYWNrYWdlTmFtZUNvbHVtbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogUHJvdmlkZXMgd2lkZ2V0cyBmb3IgV1NETDJKYXZhIHByZWZlcmVuY2VzLCB3aXphcmRzLCBkaWFsb2dzLiBFbmFibGVzIHRoZQotICogcmV1c2Ugb2Ygd2lkZ2V0cyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMuIFdpZGdldHMgaGF2ZSB0aGVyZSBsYWJlbGluZyBhbmQKLSAqIHRvb2x0aXBzIHNldCBoZXJlIGFuZCB3aGVyZSBwb3NzaWJsZSBsaXN0ZW5lcnMgYXJlIHNldCB3aGljaCB1cGRhdGUgaW5zdGFuY2VzCi0gKiBvZiA8Y29kZT5XU0RMMkphdmFDb250ZXh0PC9jb2RlPiBhbmQgPGNvZGU+V1NETDJKYXZhRGF0YU1vZGVsPC9jb2RlPi4KLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETDJKYXZhV2lkZ2V0RmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19EVl9BUkcgPSAiLVhkdiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX1RTX0FSRyA9ICItWHRzIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfTVVMVElfQVJHID0gIi1YdHM6c3R5bGU6bXVsdGlsaW5lIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfVFNfU0lNUExFID0gIi1YdHM6c3R5bGU6c2ltcGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfTE9DQVRPUl9BUkcgPSAiLVhsb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYSkNfU1lOQ19NRVRIT0RTX0FSRyA9ICItWHN5bmMtbWV0aG9kcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEpDX01BUktfR0VORVJBVEVEX0FSRyA9ICItbWFyay1nZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhKQ19FUElTT0RFX0ZJTEVfQVJHID0gIi1lcGlzb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMMkphdmFXaWRnZXRGYWN0b3J5KCkgewotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUdlbmVyYXRlQ2xpZW50QnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkNsaWVudEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkpBVkEyV1NfR0VOX0NMSUVOVF9MQUJFTCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9HRU5FUkFURV9DTElFTlRfVE9PTFRJUCk7Ci0gICAgICAgIGdlbkNsaWVudEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldEdlbmVyYXRlQ2xpZW50KGdlbkNsaWVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBnZW5DbGllbnRCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVDbGllbnQoKSk7Ci0gICAgICAgIHJldHVybiBnZW5DbGllbnRCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlR2VuZXJhdGVTZXJ2ZXJCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZ2VuU2VydmVyQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fU0VSVkVSX0xBQkVMKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX1NFUlZFUl9UT09MVElQKTsKLSAgICAgICAgZ2VuU2VydmVyQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVTZXJ2ZXIoZ2VuU2VydmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlblNlcnZlckJ1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNHZW5lcmF0ZVNlcnZlcigpKTsKLSAgICAgICAgcmV0dXJuIGdlblNlcnZlckJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVHZW5lcmF0ZUltcGxlbWVudGF0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGdlbkltcGxlbWVudGF0aW5CdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ2VuSW1wbGVtZW50YXRpbkJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuSkFWQTJXU19HRU5fSU1QTEVNRU5UQVRJT05fTEFCRUwpOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0dFTkVSQVRFX0lNUExFTUVOVEFUSU9OX1RPT0xUSVApOwotICAgICAgICBnZW5JbXBsZW1lbnRhdGluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihnZW5JbXBsZW1lbnRhdGluQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGdlbkltcGxlbWVudGF0aW5CdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzR2VuZXJhdGVJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgcmV0dXJuIGdlbkltcGxlbWVudGF0aW5CdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSUyk7Ci0gICAgICAgIHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QUk9DRVNTX1NPQVBfSEVBREVSU19UT09MVElQKTsKLSAgICAgICAgcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0UHJvY2Vzc1NPQVBIZWFkZXJzKHByb2Nlc3NTT0FQSGVhZGVyc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBwcm9jZXNzU09BUEhlYWRlcnNCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzUHJvY2Vzc1NPQVBIZWFkZXJzKCkpOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1NPQVBIZWFkZXJzQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZU5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uCi0gICAgICAgIC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0xPQURfREVGQVVMVF9OQU1FU1BBQ0VfUEFDS0FHRV9NQVBQSU5HKTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24KLSAgICAgICAgLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0RFRkFVTFRfTkFNRVNQQUNFX0xPQURJTkdfVE9PTFRJUCk7Ci0gICAgICAgIG5hbWVzcGFjZVBhY2thZ2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcobmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbmFtZXNwYWNlUGFja2FnZU1hcHBpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzTG9hZERlZmF1bHROYW1lc3BhY2VQYWNrYWdlTmFtZU1hcHBpbmcoKSk7Ci0gICAgICAgIHJldHVybiBuYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVFeGNsdWRlc05hbWVzcGFjZU1hcHBpbmdCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9VU0VfREVGQVVMVF9FWENMVURFU19OQU1FU1BBQ0VfTUFQUElORyk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbgotICAgICAgICAuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfRVhDTFVERV9OQU1FU1BBQ0VfTE9BRElOR19UT09MVElQKTsKLSAgICAgICAgZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0TG9hZERlZmF1bHRFeGNsdWRlc05hbWVwc2FjZU1hcHBpbmcoZXhjbHVkZXNOYW1lc3BhY2VNYXBwaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbi5zZXRTZWxlY3Rpb24obW9kZWwuaXNMb2FkRGVmYXVsdEV4Y2x1ZGVzTmFtZXBzYWNlTWFwcGluZygpKTsKLSAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzTmFtZXNwYWNlTWFwcGluZ0J1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOb0FkZHJlc3NCaW5kaW5nQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuYmluZChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9OT19BRERSRVNTX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgbW9kZWwuZ2V0RGVmYXVsdFJ1bnRpbWVUeXBlKCkpKTsKLSAgICAgICAgbm9BZGRyZXNzQmluZGluZ0J1dHRvbi5zZXRUb29sVGlwVGV4dCgKLSAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLmJpbmQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfTk9fQUREUkVTU19CSU5ESU5HX1RPT0xUSVAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXREZWZhdWx0UnVudGltZVR5cGUoKSkpOwotICAgICAgICBub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0Tm9BZGRyZXNzQmluZGluZyhub0FkZHJlc3NCaW5kaW5nQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG5vQWRkcmVzc0JpbmRpbmdCdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzTm9BZGRyZXNzQmluZGluZygpKTsKLSAgICAgICAgcmV0dXJuIG5vQWRkcmVzc0JpbmRpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQnV0dG9uIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTik7Ci0gICAgICAgIGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9BVVRPX05BTUVfUkVTT0xVVElPTl9UT09MVElQKTsKLSAgICAgICAgYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0QXV0b05hbWVSZXNvbHV0aW9uKGF1dG9OYW1lUmVzb2x1dGlvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhdXRvTmFtZVJlc29sdXRpb25CdXR0b24uc2V0U2VsZWN0aW9uKG1vZGVsLmlzQXV0b05hbWVSZXNvbHV0aW9uKCkpOwotICAgICAgICByZXR1cm4gYXV0b05hbWVSZXNvbHV0aW9uQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ0RlZmF1bHRWYWx1ZXNUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNEZWZhdWx0VmFsdWVzSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMCwgWEpDX0RWX0FSRyk7Ci0gICAgICAgIHhqY0RlZmF1bHRWYWx1ZXNJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgeGpjRGVmYXVsdFZhbHVlc0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB4amNEZWZhdWx0VmFsdWVzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1RhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19BUkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkcpOwotICAgICAgICB4amNUb1N0cmluZ0l0ZW0uc2V0Q2hlY2tlZChtb2RlbC5pc1hqY1RvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4geGpjVG9TdHJpbmdJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1RvU3RyaW5nTXVsdGlMaW5lVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwKLSAgICAgICAgICAgIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19NVUxUSV9BUkcpOwotICAgICAgICB4amNUb1N0cmluZ011bHRpTGluZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfTVVMVElMSU5FKTsKLSAgICAgICAgeGpjVG9TdHJpbmdNdWx0aUxpbmVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ011bHRpTGluZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nTXVsdGlMaW5lSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNUb1N0cmluZ1NpbXBsZVRhYmxlSXRlbShUYWJsZSB4amNBcmdzVGFibGUsIGZpbmFsIFdTREwySmF2YUNvbnRleHQgbW9kZWwpIHsKLSAgICAgICAgVGFibGVJdGVtIHhqY1RvU3RyaW5nU2ltcGxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY1RvU3RyaW5nU2ltcGxlSXRlbS5zZXRUZXh0KDAsIFhKQ19UU19TSU1QTEUpOwotICAgICAgICB4amNUb1N0cmluZ1NpbXBsZUl0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfVE9TVFJJTkdfU0lNUExFKTsKLSAgICAgICAgeGpjVG9TdHJpbmdTaW1wbGVJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNUb1N0cmluZ1NpbXBsZSgpKTsKLSAgICAgICAgcmV0dXJuIHhqY1RvU3RyaW5nU2ltcGxlSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNMb2NhdG9yVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTG9jYXRvckl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRUZXh0KDAsIFhKQ19MT0NBVE9SX0FSRyk7Ci0gICAgICAgIHhqY0xvY2F0b3JJdGVtLnNldFRleHQoMSwgQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWEpDX0xPQ0FUT1IpOwotICAgICAgICB4amNMb2NhdG9ySXRlbS5zZXRDaGVja2VkKG1vZGVsLmlzWGpjTG9jYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIHhqY0xvY2F0b3JJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGVJdGVtIGNyZWF0ZVhKQ1N5bmNNZXRob2RzVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjU3luY01ldGhvZHNJdGVtID0gbmV3IFRhYmxlSXRlbSh4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldFRleHQoMCwgWEpDX1NZTkNfTUVUSE9EU19BUkcpOwotICAgICAgICB4amNTeW5jTWV0aG9kc0l0ZW0uc2V0VGV4dCgxLCBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfU1lOQ19NRVRIT0RTKTsKLSAgICAgICAgeGpjU3luY01ldGhvZHNJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNTeW5jTWV0aG9kcygpKTsKLSAgICAgICAgcmV0dXJuIHhqY1N5bmNNZXRob2RzSXRlbTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRhYmxlSXRlbSBjcmVhdGVYSkNNYXJrR2VuZXJhdGVkVGFibGVJdGVtKFRhYmxlIHhqY0FyZ3NUYWJsZSwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZUl0ZW0geGpjTWFya0dlbmVyYXRlZEl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDAsIFhKQ19NQVJLX0dFTkVSQVRFRF9BUkcpOwotICAgICAgICB4amNNYXJrR2VuZXJhdGVkSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19NQVJLX0dFTkVSQVRFRCk7Ci0gICAgICAgIHhqY01hcmtHZW5lcmF0ZWRJdGVtLnNldENoZWNrZWQobW9kZWwuaXNYamNNYXJrR2VuZXJhdGVkKCkpOwotICAgICAgICByZXR1cm4geGpjTWFya0dlbmVyYXRlZEl0ZW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZUl0ZW0gY3JlYXRlWEpDRXBpc29kZUZpbGVUYWJsZUl0ZW0oVGFibGUgeGpjQXJnc1RhYmxlLCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlSXRlbSB4amNFcGlzb2RlRmlsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHhqY0FyZ3NUYWJsZSwgU1dULk5PTkUpOwotICAgICAgICB4amNFcGlzb2RlRmlsZUl0ZW0uc2V0VGV4dCgwLCBYSkNfRVBJU09ERV9GSUxFX0FSRyk7Ci0gICAgICAgIHhqY0VwaXNvZGVGaWxlSXRlbS5zZXRUZXh0KDEsIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19FUElTT0RFX0ZJTEUpOwotICAgICAgICByZXR1cm4geGpjRXBpc29kZUZpbGVJdGVtOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlWEpDQXJnVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBUYWJsZSB4amNBcmdzVGFibGUgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLSAgICAgICAgeGpjQXJnc1RhYmxlLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdTX1RPT0xUSVApOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotICAgICAgICBUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotICAgICAgICB4amNBcmdzVGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotICAgICAgICBUYWJsZUNvbHVtbiB4amNBcmdDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oeGpjQXJnc1RhYmxlLCBTV1QuTk9ORSk7Ci0gICAgICAgIHhqY0FyZ0NvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hKQ19BUkdfQ09MVU1OX05BTUUpOwotCi0gICAgICAgIENvbHVtbldlaWdodERhdGEgY29sdW1uV2VpZ2h0RGF0YSA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKDEwMCwgMTAwLCB0cnVlKTsKLSAgICAgICAgdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2x1bW5XZWlnaHREYXRhKTsKLQotICAgICAgICBUYWJsZUNvbHVtbiBkZXNjcmlwdGlvbkNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih4amNBcmdzVGFibGUsIFNXVC5OT05FKTsKLSAgICAgICAgZGVzY3JpcHRpb25Db2x1bW4uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9YSkNfREVTQ1JJUFRJT05fQ09MVU1OX05BTUUpOwotICAgICAgICBjb2x1bW5XZWlnaHREYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjAwLCAyMDAsIHRydWUpOwotICAgICAgICB0YWJsZUxheW91dC5hZGRDb2x1bW5EYXRhKGNvbHVtbldlaWdodERhdGEpOwotCi0gICAgICAgIHhqY0FyZ3NUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChldmVudC5kZXRhaWwgPT0gU1dULkNIRUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBldmVudC5pdGVtOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgeGpjQXJnID0gdGFibGVJdGVtLmdldFRleHQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tlZCA9IHRhYmxlSXRlbS5nZXRDaGVja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19EVl9BUkcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5zZXRYamNVc2VEZWZhdWx0VmFsdWVzKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX01VTFRJX0FSRykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nTXVsdGlMaW5lKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX1RTX1NJTVBMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLnNldFhqY1RvU3RyaW5nU2ltcGxlKGNoZWNrZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHhqY0FyZy5lcXVhbHMoWEpDX0xPQ0FUT1JfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTG9jYXRvcihjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh4amNBcmcuZXF1YWxzKFhKQ19TWU5DX01FVEhPRFNfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjU3luY01ldGhvZHMoY2hlY2tlZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoeGpjQXJnLmVxdWFscyhYSkNfTUFSS19HRU5FUkFURURfQVJHKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuc2V0WGpjTWFya0dlbmVyYXRlZChjaGVja2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICB4amNBcmdDb2x1bW4ucGFjaygpOwotICAgICAgICBkZXNjcmlwdGlvbkNvbHVtbi5wYWNrKCk7Ci0KLSAgICAgICAgcmV0dXJuIHhqY0FyZ3NUYWJsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUZyb250ZW5kTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBmcm9udGVuZExhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBmcm9udGVuZExhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfREVGQVVMVF9GUk9OVEVORF9MQUJFTCk7Ci0gICAgICAgIHJldHVybiBmcm9udGVuZExhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlRnJvbnRlbmRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFDb250ZXh0IG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIGZyb250ZW5kQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9GUk9OVEVORF9UT09MVElQKTsKLSAgICAgICAgZnJvbnRlbmRDb21iby5hZGQobW9kZWwuZ2V0RnJvbnRlbmQoKS5nZXRMaXRlcmFsKCkpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBmcm9udGVuZENvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgcmV0dXJuIGZyb250ZW5kQ29tYm87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEYXRhYmluZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgTGFiZWwgZGF0YWJpbmRpbmdMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgZGF0YWJpbmRpbmdMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX0RFRkFVTFRfREFUQUJJTkRJTkdfTEFCRUwpOwotICAgICAgICByZXR1cm4gZGF0YWJpbmRpbmdMYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZURhdGFiaW5kaW5nQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyBkYXRhYmluZGluZ0NvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfREFUQUJJTkRJTkdfVE9PTFRJUCk7Ci0gICAgICAgIGRhdGFiaW5kaW5nQ29tYm8uYWRkKG1vZGVsLmdldERhdGFiaW5kaW5nKCkuZ2V0TGl0ZXJhbCgpKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZGF0YWJpbmRpbmdDb21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiBkYXRhYmluZGluZ0NvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlV1NETFZlcnNpb25MYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIExhYmVsIHdzZGxWZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9XU0RMX1ZFUlNJT05fTEFCRUwpOwotICAgICAgICByZXR1cm4gd3NkbFZlcnNpb25MYWJlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVdTRExWZXJzaW9uQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBDb21ibyB3c2RsVmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIHdzZGxWZXJzaW9uQ29tYm8uc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfV1NETF9WRVJTSU9OX1RPT0xUSVApOwotICAgICAgICB3c2RsVmVyc2lvbkNvbWJvLmFkZChtb2RlbC5nZXRXc2RsVmVyc2lvbigpKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgd3NkbFZlcnNpb25Db21iby5zZWxlY3QoMCk7Ci0gICAgICAgIHJldHVybiB3c2RsVmVyc2lvbkNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZURlZmF1bHRWYWx1ZXNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhQ29udGV4dCBtb2RlbCkgewotICAgICAgICBmaW5hbCBCdXR0b24gdXNlRGVmYXVsdFZhbHVlc0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfVVNFX0RFRkFVTFRfVkFMVUVTKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9ERUZBVUxUX1ZBTFVFU19UT09MVElQKTsKLSAgICAgICAgdXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIG1vZGVsLnNldFVzZURlZmF1bHRWYWx1ZXModXNlRGVmYXVsdFZhbHVlc0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uLnNldFNlbGVjdGlvbihtb2RlbC5pc1VzZURlZmF1bHRWYWx1ZXMoKSk7Ci0gICAgICAgIHJldHVybiB1c2VEZWZhdWx0VmFsdWVzQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlT3V0cHV0RGlyZWN0b3J5TGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzcmNEaXJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgc3JjRGlyTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9PVVRQVVRfRElSRUNUT1JZKTsKLSAgICAgICAgc3JjRGlyTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfT1VUUFVUX0RJUkVDVE9SWV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIHNyY0RpckxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlT3V0cHV0RGlyZWN0b3J5Q29tYm8oQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIENvbWJvIG91dHB1dERpckNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX09VVFBVVF9ESVJFQ1RPUllfVE9PTFRJUCk7Ci0gICAgICAgIG91dHB1dERpckNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGphdmFTb3VyY2VGb2xkZXIgPSBvdXRwdXREaXJDb21iby5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgbW9kZWwuc2V0SmF2YVNvdXJjZUZvbGRlcihqYXZhU291cmNlRm9sZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcG9wdWxhdGVPdXRwdXREaXJlY3RvcnlDb21ibyhvdXRwdXREaXJDb21ibywgbW9kZWwuZ2V0UHJvamVjdE5hbWUoKSk7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dERpckNvbWJvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwb3B1bGF0ZU91dHB1dERpcmVjdG9yeUNvbWJvKENvbWJvIG91dHB1dERpckNvbWJvLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgb3V0cHV0RGlyQ29tYm8ucmVtb3ZlQWxsKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpCi0gICAgICAgICAgICAuZ2V0QWxsUGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZUZyYWdtZW50Um9vdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dERpckNvbWJvLmFkZChwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dERpckNvbWJvLnNlbGVjdCgwKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgQ1hGVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhY2thZ2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBwYWNrYWdlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBwYWNrYWdlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FKTsKLSAgICAgICAgcGFja2FnZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVQYWNrYWdlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIGZpbmFsIFRleHQgcGFja2FnZU5hbWVUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9UT09MVElQKTsKLQotICAgICAgICBwYWNrYWdlTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVUZXh0LmdldFRleHQoKTsKLSAgICAgICAgICAgICAgICBtb2RlbC5nZXRJbmNsdWRlZE5hbWVzcGFjZXMoKS5wdXQobW9kZWwuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcGFja2FnZU5hbWVUZXh0LnNldFRleHQobW9kZWwuZ2V0SW5jbHVkZWROYW1lc3BhY2VzKCkuZ2V0KG1vZGVsLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIHBhY2thZ2VOYW1lVGV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVOYW1lc3BhY2VQYWNrYWdlTWFwcGluZ0J1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIEJ1dHRvbiBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0gICAgICAgIG5hbWVzcGFjZU1hcHBpbmdCdXR0b24uc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9QQUNLQUdFX05BTUVfT1BUSU9OQUwpOwotICAgICAgICBuYW1lc3BhY2VNYXBwaW5nQnV0dG9uLnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1BBQ0tBR0VfTkFNRV9PUFRJT05BTF9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU1hcHBpbmdCdXR0b247Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVXU0RMTmFtZXNwYWNlVmlld2VyQ29sdW1uKFRhYmxlVmlld2VyIHRhYmxlVmlld2VyKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5MRUZUKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBUYWJsZUNvbHVtbiB3c2RsTmFtZXNwYWNlQ29sdW1uID0gd3NkbE5hbWVzcGFjZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKLSAgICAgICAgd3NkbE5hbWVzcGFjZUNvbHVtbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1dTRExfTkFNRVNQQUNFX0NPTFVNTl9IRUFERVIpOwotICAgICAgICB3c2RsTmFtZXNwYWNlQ29sdW1uLnBhY2soKTsKLSAgICAgICAgcmV0dXJuIHdzZGxOYW1lc3BhY2VWaWV3ZXJDb2x1bW47Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlckNvbHVtbiBjcmVhdGVQYWNrYWdlTmFtZUNvbHVtbihUYWJsZVZpZXdlciB0YWJsZVZpZXdlciwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIFRhYmxlVmlld2VyQ29sdW1uIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRhYmxlVmlld2VyLCBTV1QuTEVGVCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lQ29sdW1uTGFiZWxQcm92aWRlcihtb2RlbCkpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHBhY2thZ2VOYW1lQ29sdW1uID0gcGFja2FnZU5hbWVWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lQ29sdW1uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfUEFDS0FHRV9OQU1FX0NPTFVNTl9IRUFERVIpOwotICAgICAgICBwYWNrYWdlTmFtZUNvbHVtbi5wYWNrKCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZVZpZXdlckNvbHVtbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVNlcnZpY2VOYW1lTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBzZXJ2aWNlTmFtZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBzZXJ2aWNlTmFtZUxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfU0VSVklDRV9OQU1FKTsKLSAgICAgICAgc2VydmljZU5hbWVMYWJlbC5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZUxhYmVsOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlU2VydmljZU5hbWVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgZmluYWwgQ29tYm8gc2VydmljZU5hbWVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5zZXRUb29sVGlwVGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9TRVJWSUNFX05BTUVfVE9PTFRJUCk7Ci0KLSAgICAgICAgc2VydmljZU5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRTZXJ2aWNlTmFtZShzZXJ2aWNlTmFtZUNvbWJvLmdldFRleHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhzZXJ2aWNlTmFtZUNvbWJvLCBtb2RlbCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lQ29tYm87Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHBvcHVsYXRlU2VydmljZU5hbWVDb21ibyhDb21ibyBzZXJ2aWNlTmFtZUNvbWJvLCBXU0RMMkphdmFEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgc2VydmljZU5hbWVDb21iby5yZW1vdmVBbGwoKTsKLSAgICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gbW9kZWwuZ2V0V3NkbERlZmluaXRpb24oKTsKLSAgICAgICAgaWYgKGRlZmluaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgTWFwIHNlcnZpY2VzTWFwID0gZGVmaW5pdGlvbi5nZXRTZXJ2aWNlcygpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VzTWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTZXQgc2VydmljZXNFbnRyeVNldCA9IHNlcnZpY2VzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3Igc2VydmljZXNJdGVyYXRvciA9IHNlcnZpY2VzRW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoc2VydmljZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA9IChNYXAuRW50cnkpIHNlcnZpY2VzSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSAoU2VydmljZSkgc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFFOYW1lIHFOYW1lID0gc2VydmljZS5nZXRRTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZUNvbWJvLmFkZChxTmFtZS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lQ29tYm8uZGVzZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlQmluZGluZ0ZpbGVzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCBiaW5kaW5nRmlsZXNMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVTKTsKLSAgICAgICAgYmluZGluZ0ZpbGVzTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19OQU1FX1RPT0xUSVApOwotICAgICAgICByZXR1cm4gYmluZGluZ0ZpbGVzTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUJpbmRpbmdGaWxlc0xpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBMaXN0IGJpbmRpbmdGaWxlc0xpc3QgPSBuZXcgTGlzdChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LnNldFRvb2xUaXBUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfTkFNRV9UT09MVElQKTsKLSAgICAgICAgcmV0dXJuIGJpbmRpbmdGaWxlc0xpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQWRkQmluZGluZ0ZpbGVCdXR0b24oZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgV1NETDJKYXZhRGF0YU1vZGVsIG1vZGVsLAotICAgICAgICAgICAgZmluYWwgTGlzdCBiaW5kaW5nRmlsZXNMaXN0KSB7Ci0gICAgICAgIEJ1dHRvbiBhZGRCaW5kaW5nRmlsZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0gICAgICAgIGFkZEJpbmRpbmdGaWxlQnV0dG9uLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfQklORElOR19GSUxFU19BREQpOwotICAgICAgICBhZGRCaW5kaW5nRmlsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIFJlc291cmNlU2VsZWN0aW9uRGlhbG9nIHNlbGVjdGlvbkRpYWxvZyA9IG5ldyBSZXNvdXJjZVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInhtbCIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRV9ESUFMT0dfRklMVEVSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX1RJVExFKTsKLSAgICAgICAgICAgICAgICBzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShDWEZVSU1lc3NhZ2VzLldTREwySkFWQV9CSU5ESU5HX0ZJTEVfRElBTE9HX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFNlbGVjdGlvbkRpYWxvZy5PSykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuY29udGFpbnMocmVzdWx0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0QmluZGluZ0ZpbGVzKCkuYWRkKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LmFkZChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGFkZEJpbmRpbmdGaWxlQnV0dG9uOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCwKLSAgICAgICAgICAgIGZpbmFsIExpc3QgYmluZGluZ0ZpbGVzTGlzdCkgewotICAgICAgICBmaW5hbCBCdXR0b24gcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX0JJTkRJTkdfRklMRVNfUkVNT1ZFKTsKLSAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIHJlbW92ZUJpbmRpbmdGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2VsZWN0ZWRCaW5kaW5nRmlsZXMgPSBiaW5kaW5nRmlsZXNMaXN0LmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGJpbmRpbmdGaWxlIDogc2VsZWN0ZWRCaW5kaW5nRmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYmluZGluZ0ZpbGVzTGlzdC5yZW1vdmUoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRCaW5kaW5nRmlsZXMoKS5yZW1vdmUoYmluZGluZ0ZpbGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmlsZXNMaXN0LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBiaW5kaW5nRmlsZXNMaXN0LmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nRmlsZXNMaXN0LmdldEl0ZW1Db3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQmluZGluZ0ZpbGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiByZW1vdmVCaW5kaW5nRmlsZUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZVBhZGRpbmdMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVYTUxDYXRhbG9nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBMYWJlbCB4bWxDYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIHhtbENhdGFsb2dMYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRMT0cpOwotICAgICAgICB4bWxDYXRhbG9nTGFiZWwuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUCk7Ci0gICAgICAgIHJldHVybiB4bWxDYXRhbG9nTGFiZWw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVhNTENhdGFsb2dUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFdTREwySmF2YURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBmaW5hbCBUZXh0IHhtbENhdGFsb2dUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLSAgICAgICAgeG1sQ2F0YWxvZ1RleHQuc2V0VG9vbFRpcFRleHQoQ1hGVUlNZXNzYWdlcy5XU0RMMkpBVkFfWE1MX0NBVEFMT0dfVE9PTFRJUCk7Ci0gICAgICAgIHhtbENhdGFsb2dUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB4bWxDYXRhbG9nID0geG1sQ2F0YWxvZ1RleHQuZ2V0VGV4dCgpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldENhdGFsb2dGaWxlKHhtbENhdGFsb2cpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4geG1sQ2F0YWxvZ1RleHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlWE1MQ2F0YWxvZ0Jyb3dzZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIEJ1dHRvbiB4bWxDYXRhbG9nQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLSAgICAgICAgeG1sQ2F0YWxvZ0Jyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuV1NETDJKQVZBX1hNTF9DQVRMT0dfQlJPV1NFKTsKLSAgICAgICAgcmV0dXJuIHhtbENhdGFsb2dCcm93c2VCdXR0b247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTg3N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5JQ2xhc3NwYXRoQ29udGFpbmVyUGFnZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDb3JlUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS5DWEZVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOw0KLQ0KLXB1YmxpYyBjbGFzcyBDWEZDbGFzc3BhdGhDb250YWluZXJQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXJQYWdlLCBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZUV4dGVuc2lvbiB7DQotDQotICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsNCi0gICAgcHJpdmF0ZSBDb21ib1ZpZXdlciBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXI7DQotICAgIHByaXZhdGUgTGluayBsaW5rOw0KLSAgICBwcml2YXRlIENYRkNvbnRleHQgY29udGV4dDsNCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsOw0KLSAgICBwcml2YXRlIFN0cmluZyBpbnRhbGxlZFZlcnNpb247DQotDQotICAgIHB1YmxpYyBDWEZDbGFzc3BhdGhDb250YWluZXJQYWdlKCkgew0KLSAgICAgICAgc3VwZXIoImN4Zi5jbGFzc3BhdGguY29udGFpbmVyLnBhZ2UiKTsNCi0gICAgICAgIHNldFRpdGxlKENYRlVJTWVzc2FnZXMuQ1hGX0lOU1RBTExfV0laQVJEX1BBR0VfVElUTEUpOw0KLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ1hGVUlNZXNzYWdlcy5DWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7DQotICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoQ1hGVUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy93aXpiYW4vbGlicmFyeV93aXoucG5nIikpOw0KLSAgICAgICAgY29udGV4dCA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEphdmEyV1NDb250ZXh0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgew0KLSAgICAgICAgcmV0dXJuIHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIElDbGFzc3BhdGhFbnRyeSBnZXRTZWxlY3Rpb24oKSB7DQotICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IGdldFNlbGVjdGVkSW5zdGFsbCgpOw0KLSAgICAgICAgaWYgKHNlbGVjdGVkSW5zdGFsbCAhPSBudWxsICYmICFzZWxlY3RlZEluc3RhbGwuZ2V0VmVyc2lvbigpLmVxdWFscyhpbnRhbGxlZFZlcnNpb24pKSB7DQotICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q1hGUnVudGltZVZlcnNpb24ocHJvamVjdCwgc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7DQotDQotICAgICAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZSBqc3RDb21wb25lbnREZXBlbmRlbmN5ID0NCi0gICAgICAgICAgICAgICAgSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiLCAiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoQ1hGQ29yZVBsdWdpbi5DWEZfQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7DQotICAgICAgICAgICAgcGF0aCA9IHBhdGguYXBwZW5kKHNlbGVjdGVkSW5zdGFsbC5nZXRUeXBlKCkpOw0KLSAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZChzZWxlY3RlZEluc3RhbGwuZ2V0VmVyc2lvbigpKTsNCi0gICAgICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkocGF0aCwgbmV3IElBY2Nlc3NSdWxlWzBdLA0KLSAgICAgICAgICAgICAgICAgICAgQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5pc0V4cG9ydENYRkNsYXNzcGF0aENvbnRhaW5lcigpDQotICAgICAgICAgICAgICAgICAgICA/IG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW117anN0Q29tcG9uZW50RGVwZW5kZW5jeX0gOiBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtde30sDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElDbGFzc3BhdGhFbnRyeSBjb250YWluZXJFbnRyeSkgew0KLSAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIGludGFsbGVkVmVyc2lvbiA9IENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENYRlJ1bnRpbWVWZXJzaW9uKHByb2plY3QpOw0KLSAgICAgICAgICAgIGRlZmF1bHRJbnN0YWxsID0gY29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGludGFsbGVkVmVyc2lvbik7DQotICAgICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YWxsICE9IG51bGwgJiYgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZWZhdWx0SW5zdGFsbCksIHRydWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQ0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOw0KLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsNCi0NCi0gICAgICAgIGxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsIFNXVC5OT05FKTsNCi0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9DT05GSUdVUkVfSU5TVEFMTEVEX1JVTlRJTUVTX0xBQkVMKTsNCi0gICAgICAgIGxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWRJbmRleCA9IGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5nZXRDb21ibygpLmdldFNlbGVjdGlvbkluZGV4KCk7DQotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIsIC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UifSwgbnVsbCkub3BlbigpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7DQotICAgICAgICAgICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIucmVmcmVzaCgpOw0KLSAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2VsZWN0KHNlbGVjdGVkSW5kZXgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOw0KLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOw0KLSAgICAgICAgbGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9QUk9QRVJUWV9QQUdFX1JVTlRJTUVfTEFCRUwpOw0KLQ0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOw0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7DQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/Pikgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIENYRkluc3RhbGwgY3hmSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBlbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN4Zkluc3RhbGwuZ2V0VHlwZSgpICsgIiAiICsgY3hmSW5zdGFsbC5nZXRWZXJzaW9uKCk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPENYRkluc3RhbGw+IGluc3RhbGxhdGlvbnMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKS52YWx1ZXMoKTsNCi0NCi0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRJbnB1dChpbnN0YWxsYXRpb25zKTsNCi0NCi0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsNCi0gICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsNCi0gICAgICAgIHNldFNlbGVjdGlvbihudWxsKTsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudEVudHJpZXMpIHsNCi0gICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgQ1hGSW5zdGFsbCBnZXRTZWxlY3RlZEluc3RhbGwoKSB7DQotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLSAgICAgICAgaWYgKCFzdHJ1Y3R1cmVkU2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIENYRkluc3RhbGwgc2VsZWN0ZWRJbnN0YWxsID0gKENYRkluc3RhbGwpIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSW5zdGFsbDsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBudWxsOw0KLSAgICB9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkMjY2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jeGYvdWkvd2l6YXJkcy9DWEZGYWNldEluc3RhbGxXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUuQ1hGQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLmNvcmUubW9kZWwuQ1hGRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5BYnN0cmFjdEZhY2V0V2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIENYRkZhY2V0SW5zdGFsbFdpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdEZhY2V0V2l6YXJkUGFnZSB7Ci0KLSAgICBwcml2YXRlIENYRkRhdGFNb2RlbCBkYXRhTW9kZWw7Ci0gICAgcHJpdmF0ZSBDWEZDb250ZXh0IGN4ZkNvbnRleHQ7Ci0KLSAgICBwcml2YXRlIENvbWJvVmlld2VyIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlcjsKLQotICAgIHB1YmxpYyBDWEZGYWNldEluc3RhbGxXaXphcmRQYWdlKCkgewotICAgICAgICBzdXBlcigiY3hmLmNvcmUuZmFjZXQuaW5zdGFsbC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2V0VGl0bGUoQ1hGVUlNZXNzYWdlcy5DWEZfRkFDRVRfSU5TVEFMTF9XSVpBUkRfUEFHRV9USVRMRSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKENYRlVJTWVzc2FnZXMuQ1hGX0ZBQ0VUX0lOU1RBTExfV0laQVJEX1BBR0VfREVTQ1JJUFRJT04pOwotICAgICAgICBjeGZDb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoT2JqZWN0IGNvbmZpZykgewotICAgICAgICBkYXRhTW9kZWwgPSAoQ1hGRGF0YU1vZGVsKSBjb25maWc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdHJhbnNmZXJTdGF0ZVRvQ29uZmlnKCkgewotICAgICAgICBTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICBDWEZJbnN0YWxsIHNlbGVjdGVkSW5zdGFsbCA9IChDWEZJbnN0YWxsKSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICBpZiAoc2VsZWN0ZWRJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRhdGFNb2RlbC5zZXREZWZhdWx0UnVudGltZVZlcnNpb24oc2VsZWN0ZWRJbnN0YWxsLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVMb2NhdGlvbihzZWxlY3RlZEluc3RhbGwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuc2V0RGVmYXVsdFJ1bnRpbWVUeXBlKHNlbGVjdGVkSW5zdGFsbC5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBMaW5rIGxpbmsgPSBuZXcgTGluayhjb21wb3NpdGUsIFNXVC5SSUdIVCk7Ci0gICAgICAgIGxpbmsuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9DT05GSUdVUkVfSU5TVEFMTEVEX1JVTlRJTUVTX0xBQkVMKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGludCBzZWxlY3RlZEluZGV4ID0gaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpLkNYRlJ1bnRpbWVQcmVmZXJlbmNlc1BhZ2UiIH0sIG51bGwpLm9wZW4oKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldERlZmF1bHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5FTkQsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgbGluay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgbGFiZWwuc2V0VGV4dCgiQ1hGIHJ1bnRpbWU6Iik7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgaW5zdGFsbGF0aW9uc0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uPD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENYRkluc3RhbGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ1hGSW5zdGFsbCBjeGZJbnN0YWxsID0gKENYRkluc3RhbGwpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjeGZJbnN0YWxsLmdldFR5cGUoKSArICIgIiArIGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxDWEZJbnN0YWxsPiBpbnN0YWxsYXRpb25zID0gY3hmQ29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkudmFsdWVzKCk7Ci0gICAgICAgIGluc3RhbGxhdGlvbnNDb21ib1ZpZXdlci5zZXRJbnB1dChpbnN0YWxsYXRpb25zKTsKLSAgICAgICAgc2V0RGVmYXVsdCgpOwotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHQoKSB7Ci0gICAgICAgIFN0cmluZyBpbnRhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKYXZhMldTQ29udGV4dCgpLmdldERlZmF1bHRSdW50aW1lVmVyc2lvbigpOwotICAgICAgICBDWEZJbnN0YWxsIGRlZmF1bHRJbnN0YWxsID0gY3hmQ29udGV4dC5nZXRJbnN0YWxsYXRpb25zKCkuZ2V0KGludGFsbGVkVmVyc2lvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0SW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnN0YWxsYXRpb25zQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRJbnN0YWxsKSwgdHJ1ZSk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQxNDE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5tb2RlbC5DWEZJbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIENYRkluc3RhbGxXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0gICAgcHJpdmF0ZSBDWEZJbnN0YWxsV2l6YXJkUGFnZSBjeGZJbnN0YWxsV2l6YXJkUGFnZTsKLSAgICBwcml2YXRlIENYRkluc3RhbGwgY3hmSW5zdGFsbDsKLQotICAgIHB1YmxpYyBDWEZJbnN0YWxsV2l6YXJkKCkgewotICAgICAgICBzZXRXaW5kb3dUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9BRERfV0lORE9XX1RJVExFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1hGSW5zdGFsbFdpemFyZChDWEZJbnN0YWxsIGN4Zkluc3RhbGwpIHsKLSAgICAgICAgdGhpcy5jeGZJbnN0YWxsID0gY3hmSW5zdGFsbDsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoQ1hGVUlNZXNzYWdlcy5DWEZfSU5TVEFMTF9XSVpBUkRfRURJVF9XSU5ET1dfVElUTEUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBpZiAoY3hmSW5zdGFsbFdpemFyZFBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgY3hmSW5zdGFsbFdpemFyZFBhZ2UgPSBuZXcgQ1hGSW5zdGFsbFdpemFyZFBhZ2UoKTsKLSAgICAgICAgICAgIGlmIChjeGZJbnN0YWxsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjeGZJbnN0YWxsV2l6YXJkUGFnZS5zZXRDWEZJbnN0YWxsKGN4Zkluc3RhbGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFkZFBhZ2UoY3hmSW5zdGFsbFdpemFyZFBhZ2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiBjeGZJbnN0YWxsV2l6YXJkUGFnZS5maW5pc2goKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2N4Zi91aS93aXphcmRzL0NYRkluc3RhbGxXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzhkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY3hmL3VpL3dpemFyZHMvQ1hGSW5zdGFsbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYuY29yZS5DWEZDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLkNYRkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLmNvbnRleHQuQ1hGUGVyc2lzdGVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLm1vZGVsLkNYRkluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmN4Zi5jb3JlLnV0aWxzLkxhdW5jaFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jeGYudWkuQ1hGVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3hmLnVpLkNYRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1hGSW5zdGFsbFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLSAgICBwcml2YXRlIElTdGF0dXMgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCBudWxsKTsKLSAgICBwcml2YXRlIElTdGF0dXMgQ1hGX1RZUEVfU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsIG51bGwpOwotICAgIHByaXZhdGUgSVN0YXR1cyBDWEZfVkVSU0lPTl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgbnVsbCk7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQ1hGVUlQbHVnaW4uUExVR0lOX0lELCAiIik7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgUGF0dGVybiBkaWdpdFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIlxcZCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0IGN4ZkhvbWVEaXJUZXh0OwotICAgIHByaXZhdGUgVGV4dCBjeGZUeXBlVGV4dDsKLSAgICBwcml2YXRlIFRleHQgY3hmVmVyc2lvblRleHQ7Ci0KLSAgICBTdHJpbmcgY3hmUnVudGltZVZlcnNpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBjeGZSdW50aW1lTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBjeGZSdW50aW1lVHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIENYRkluc3RhbGwgY3hmSW5zdGFsbDsKLQotICAgIHByb3RlY3RlZCBDWEZJbnN0YWxsV2l6YXJkUGFnZSgpIHsKLSAgICAgICAgc3VwZXIoImN4Zi5pbnRhbGwud2l6YXJkLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShDWEZVSU1lc3NhZ2VzLkNYRl9JTlNUQUxMX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oQ1hGVUlNZXNzYWdlcy5DWEZfSU5TVEFMTF9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7Ci0gICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihDWEZVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgImljb25zL3dpemJhbi9saWJyYXJ5X3dpei5wbmciKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0NYRl9IT01FX0RJUl9MQUJFTCk7Ci0KLSAgICAgICAgY3hmSG9tZURpclRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGN4ZkhvbWVEaXJUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGN4ZkhvbWVEaXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxvY2F0aW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0JST1dTRV9CVVRUT05fTEFCRUwpOwotCi0gICAgICAgIGJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIERpcmVjdG9yeURpYWxvZyBmaWxlRGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZURpYWxvZy5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3hmSG9tZURpclRleHQuc2V0VGV4dChmaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvL0NYRiBWZXJzaW9uCi0gICAgICAgIExhYmVsIGN4ZlZlcnNpb25MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3hmVmVyc2lvbkxhYmVsLnNldFRleHQoQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfQ1hGX1ZFUlNJT05fTEFCRUwpOwotCi0gICAgICAgIGN4ZlZlcnNpb25UZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0gICAgICAgIGN4ZlZlcnNpb25UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjeGZWZXJzaW9uVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWZXJzaW9uU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIC8vQmxhbmsgbGFiZWwKLSAgICAgICAgbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0gICAgICAgIC8vQ1hGIFR5cGUKLSAgICAgICAgTGFiZWwgY3hmVHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBjeGZUeXBlTGFiZWwuc2V0VGV4dChDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9DWEZfVFlQRV9MQUJFTCk7Ci0KLSAgICAgICAgY3hmVHlwZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBjeGZUeXBlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgY3hmVHlwZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVHlwZVN0YXR1cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBpZiAoY3hmSW5zdGFsbCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjeGZIb21lRGlyVGV4dC5zZXRUZXh0KGN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBjeGZWZXJzaW9uVGV4dC5zZXRUZXh0KGN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIGN4ZlR5cGVUZXh0LnNldFRleHQoY3hmSW5zdGFsbC5nZXRUeXBlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOwotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q1hGSW5zdGFsbChDWEZJbnN0YWxsIGN4Zkluc3RhbGwpIHsKLSAgICAgICAgdGhpcy5jeGZJbnN0YWxsID0gY3hmSW5zdGFsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTG9jYXRpb25TdGF0dXMoKSB7Ci0gICAgICAgIENYRl9MT0NBVElPTl9TVEFUVVMgPSBjaGVja1J1bnRpbWVFeGlzdChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICBhcHBseVN0YXR1c1RvUGFnZShmaW5kTW9zdFNldmVyZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVHlwZVN0YXR1cygpIHsKLSAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gdmFsaWRhdGVUeXBlTmFtZShjeGZUeXBlVGV4dC5nZXRUZXh0KCkpOwotICAgICAgICBhcHBseVN0YXR1c1RvUGFnZShmaW5kTW9zdFNldmVyZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVmVyc2lvblN0YXR1cygpIHsKLSAgICAgICAgQ1hGX1ZFUlNJT05fU1RBVFVTID0gdmFsaWRhdGVWZXJzaW9uKGN4ZlZlcnNpb25UZXh0LmdldFRleHQoKSk7Ci0gICAgICAgIGFwcGx5U3RhdHVzVG9QYWdlKGZpbmRNb3N0U2V2ZXJlKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVN0YXR1c1RvUGFnZShJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldE1lc3NhZ2UoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgICAgIGlmIChDWEZfVFlQRV9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSA+IENYRl9MT0NBVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENYRl9UWVBFX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ1hGX1ZFUlNJT05fU1RBVFVTLmdldFNldmVyaXR5KCkgPiBDWEZfTE9DQVRJT05fU1RBVFVTLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBDWEZfVkVSU0lPTl9TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENYRl9UWVBFX1NUQVRVUy5nZXRTZXZlcml0eSgpID09IENYRl9MT0NBVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENYRl9WRVJTSU9OX1NUQVRVUy5nZXRTZXZlcml0eSgpID09IENYRl9MT0NBVElPTl9TVEFUVVMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ1hGX0xPQ0FUSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgY2hlY2tSdW50aW1lRXhpc3QoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgRmlsZSBjeGZIb21lRGlyID0gbmV3IEZpbGUocGF0aCk7Ci0gICAgICAgIGlmIChjeGZIb21lRGlyVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQ1hGVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICBDWEZVSU1lc3NhZ2VzLkNYRl9SVU5USU1FX1BSRUZFUkVOQ0VfUEFHRV9SVU5USU1FX05PVF9TRVQpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjeGZMaWJQYXRoID0gY3hmSG9tZURpciArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArICJsaWIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgaWYgKGN4ZkhvbWVEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZSBjeGZMaWJGb2xkZXIgPSBuZXcgRmlsZShjeGZMaWJQYXRoKTsKLSAgICAgICAgICAgIGlmIChjeGZMaWJGb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGN4ZkphckZpbGVzID0gZ2V0Q1hGSmFyRmlsZXMoY3hmTGliRm9sZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoY3hmSmFyRmlsZXMgIT0gbnVsbCAmJiBjeGZKYXJGaWxlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIElTdGF0dXMgdG9vbFZlcnNpb25TdGF0dXMgPSBnZXRUb29sVmVyc2lvbihjeGZMaWJQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Rvb2xWZXJzaW9uKHRvb2xWZXJzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVMgPSBPS19TVEFUVVM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGN4ZlR5cGVUZXh0LnNldFRleHQoIiIpOwotICAgICAgICBjeGZWZXJzaW9uVGV4dC5zZXRUZXh0KCIiKTsKLSAgICAgICAgQ1hGX0xPQ0FUSU9OX1NUQVRVUyA9IG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfUlVOVElNRV9OT1RfU0VUKTsKLSAgICAgICAgcmV0dXJuIENYRl9MT0NBVElPTl9TVEFUVVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlVHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIGlmICh0eXBlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwgQ1hGVUlNZXNzYWdlcy5DWEZfUlVOVElNRV9QUkVGRVJFTkNFX1BBR0VfRU5URVJfVFlQRV9OQU1FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENYRl9UWVBFX1NUQVRVUyA9IE9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXR5cGVOYW1lLm1hdGNoZXMoIlthLXpBLVowLTlfXFwtXFxzXSsiKSkgewotICAgICAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIENYRlVJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgQ1hGVUlNZXNzYWdlcy5iaW5kKENYRlVJTWVzc2FnZXMuQ1hGX1JVTlRJTUVfUFJFRkVSRU5DRV9QQUdFX0lOVkFMSURfVFlQRV9OQU1FLCB0eXBlTmFtZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ1hGX1RZUEVfU1RBVFVTID0gT0tfU1RBVFVTOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDWEZfVFlQRV9TVEFUVVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotICAgICAgICBpZiAoQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKS5nZXRJbnN0YWxsYXRpb25zKCkuY29udGFpbnNLZXkodmVyc2lvbikKLSAgICAgICAgICAgICAgICAmJiBjeGZJbnN0YWxsICE9IG51bGwgJiYgIWN4Zkluc3RhbGwuZ2V0VmVyc2lvbigpLmVxdWFscyh2ZXJzaW9uKSkgewotICAgICAgICAgICAgQ1hGX1ZFUlNJT05fU1RBVFVTID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDWEZVSVBsdWdpbi5QTFVHSU5fSUQsICJWZXJzaW9uIGFscmVhZHkgaW5zdGFsbGVkIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDWEZfVkVSU0lPTl9TVEFUVVMgPSBPS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENYRl9WRVJTSU9OX1NUQVRVUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGdldENYRkphckZpbGVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIFN0cmluZ1tdIGN4ZkphckZpbGVzID0gZGlyZWN0b3J5Lmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoImN4ZiIpICYmIG5hbWUuZW5kc1dpdGgoIi5qYXIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpZ2l0UGF0dGVybi5tYXRjaGVyKG5hbWUpLmZpbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGN4ZkphckZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyBnZXRUb29sVmVyc2lvbihTdHJpbmcgY3hMaWJGb2xkZXJQYXRoKSB7Ci0gICAgICAgIEZpbGUgY3hmTGliRm9sZGVyID0gbmV3IEZpbGUoY3hMaWJGb2xkZXJQYXRoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGN4ZkxpYiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBTdHJpbmdbXSBqYXJGaWxlcyA9IGN4ZkxpYkZvbGRlci5saXN0KG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgamFyRmlsZSA6IGphckZpbGVzKSB7Ci0gICAgICAgICAgICBjeGZMaWIuYWRkKGN4TGliRm9sZGVyUGF0aCArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5zZXBhcmF0b3IiKSArIGphckZpbGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBJU3RhdHVzIHRvb2xWZXJzaW9uU3RhdHVzID0gTGF1bmNoVXRpbHMubGF1bmNoKGN4ZkxpYi50b0FycmF5KG5ldyBTdHJpbmdbY3hmTGliLnNpemUoKV0pLAotICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmN4Zi50b29scy53c2RsdG8uV1NETFRvSmF2YSIsIG5ldyBTdHJpbmdbXSB7ICItdiIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICByZXR1cm4gdG9vbFZlcnNpb25TdGF0dXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NUb29sVmVyc2lvbihJU3RhdHVzIHRvb2xWZXJzaW9uU3RhdHVzKSB7Ci0gICAgICAgIGlmICh0b29sVmVyc2lvblN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTykgewotICAgICAgICAgICAgU3RyaW5nIGN4ZlRvb2xWZXJzaW9uID0gdG9vbFZlcnNpb25TdGF0dXMuZ2V0TWVzc2FnZSgpOwotCi0gICAgICAgICAgICBjeGZUb29sVmVyc2lvbiA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZyhjeGZUb29sVmVyc2lvbi5pbmRleE9mKCItIikgKyAxLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGN4ZlRvb2xWZXJzaW9uLmxlbmd0aCgpKS50cmltKCk7Ci0KLSAgICAgICAgICAgIE1hdGNoZXIgbWF0Y2hlciA9IGRpZ2l0UGF0dGVybi5tYXRjaGVyKGN4ZlRvb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIGlmIChtYXRjaGVyLmZpbmQoKSkgewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IG1hdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gbWF0Y2hlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5kID0gbWF0Y2hlci5lbmQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3hmUnVudGltZVR5cGUgPSBjeGZUb29sVmVyc2lvbi5zdWJzdHJpbmcoMCwgc3RhcnQpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBjeGZSdW50aW1lVmVyc2lvbiA9IGN4ZlRvb2xWZXJzaW9uLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3hmVmVyc2lvblRleHQuc2V0VGV4dChjeGZSdW50aW1lVmVyc2lvbik7Ci0gICAgICAgICAgICBjeGZUeXBlVGV4dC5zZXRUZXh0KGN4ZlJ1bnRpbWVUeXBlKTsKLSAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNldEN1cnJlbnRSdW50aW1lVmVyc2lvbihuZXcgVmVyc2lvbihjeGZSdW50aW1lVmVyc2lvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgewotICAgICAgICBDWEZQZXJzaXN0ZW50Q29udGV4dCBjb250ZXh0ID0gQ1hGQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SmF2YTJXU0NvbnRleHQoKTsKLSAgICAgICAgTWFwPFN0cmluZywgQ1hGSW5zdGFsbD4gaW5zdGFsbHMgPSBjb250ZXh0LmdldEluc3RhbGxhdGlvbnMoKTsKLSAgICAgICAgQ1hGSW5zdGFsbCBpbnN0YWxsID0gQ1hGRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ1hGSW5zdGFsbCgpOwotICAgICAgICBpbnN0YWxsLnNldFZlcnNpb24oY3hmVmVyc2lvblRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgICAgIGluc3RhbGwuc2V0TG9jYXRpb24oY3hmSG9tZURpclRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgICAgIGluc3RhbGwuc2V0VHlwZShjeGZUeXBlVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAgICAgaW5zdGFsbHMucHV0KGN4ZlJ1bnRpbWVWZXJzaW9uLCBpbnN0YWxsKTsKLSAgICAgICAgY29udGV4dC5zZXRJbnN0YWxsYXRpb25zKGluc3RhbGxzKTsKLSAgICAgICAgaWYgKGlzVXBkYXRlUmVxdWlyZWQoaW5zdGFsbCkpIHsKLSAgICAgICAgICAgIHVwZGF0ZVByb2plY3RzKGluc3RhbGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXBkYXRlUmVxdWlyZWQoQ1hGSW5zdGFsbCBpbnN0YWxsKSB7Ci0gICAgICAgIGlmIChjeGZJbnN0YWxsID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWN4Zkluc3RhbGwuZ2V0TG9jYXRpb24oKS5lcXVhbHMoaW5zdGFsbC5nZXRMb2NhdGlvbigpKQotICAgICAgICAgICAgICAgIHx8ICFjeGZJbnN0YWxsLmdldFR5cGUoKS5lcXVhbHMoaW5zdGFsbC5nZXRUeXBlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUHJvamVjdHMoQ1hGSW5zdGFsbCBpbnN0YWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBjeGZQcm9qZWN0cyA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldEZhY2V0ZWRQcm9qZWN0cyhQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImN4Zi5jb3JlIikpOwotICAgICAgICAgICAgSXRlcmF0b3I8SUZhY2V0ZWRQcm9qZWN0PiBwcm9qSXRlciA9IGN4ZlByb2plY3RzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocHJvakl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGN4ZlByb2plY3QgPSBwcm9qSXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGluc3RhbGxlZFZlcnNpb24gPSBDWEZDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDWEZSdW50aW1lVmVyc2lvbihjeGZQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlZFZlcnNpb24uZXF1YWxzKGluc3RhbGwuZ2V0VmVyc2lvbigpKSkgewotICAgICAgICAgICAgICAgICAgICBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBjbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggY29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKENYRkNvcmVQbHVnaW4uQ1hGX0NMQVNTUEFUSF9DT05UQUlORVJfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGN4ZlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkNsYXNzcGF0aENvbnRhaW5lciBjeGZDbGFzc3BhdGhDb250YWluZXIgPSBuZXcgQ1hGQ2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIGphdmFQcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLnJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN4ZkNsYXNzcGF0aENvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIENYRlVJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWQzMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlMDAyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEZlYiAwMiAxMTo1MDo0MiBHTVQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDhhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1SZWdpc3RlckJ1ZGR5OiBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlLkpBWEJDb3JlUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXhiLmNvcmUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZhMDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjkzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9hYm91dC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODQ2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWEIgVG9vbHMgKEluY3ViYXRpb24pXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBTaGFuZSBDbGFya2UgYW5kIG90aGVycyAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWQ2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1OTIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jcHJvcGVydGllcyBmaWxlIGZvciBKQVhCIENvcmUKLXBsdWdpbk5hbWU9SkFYQiBUb29scyBDb3JlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotSkFYQl9DQVRFR09SWV9OQU1FPUpBWEIKLQotWE1MX1NDSEVNQV9UWVBFX1JVTEVTPVZhbGlkYXRpb24gcnVsZXMgZ292ZXJuaW5nIHRoZSB1c2Ugb2YgQFhtbFNjaGVtYVR5cGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTIwNzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ij4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIlSkFYQl9DQVRFR09SWV9OQU1FIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkRlZmluaXRpb24iPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JPcmRlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFjY2Vzc29yT3JkZXIiLz4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFjY2Vzc29yVHlwZSIvPgotICAgICAgCi0gICAgICA8IS0tIFRPRE8gUmVpbnN0YXRlIHdoZW4gWG1sQWRhcHRlciBpc3N1ZSBpcyBzb2x2ZWQKLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEFkYXB0ZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxBZGFwdGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIC0tPgotICAgICAgCi0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxBbnlBdHRyaWJ1dGUiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbEFueUVsZW1lbnQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZiIKLSAgICAgICAgICAgIG5hbWU9IlhtbEF0dGFjaG1lbnRSZWYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlIgotICAgICAgICAgICAgbmFtZT0iWG1sQXR0cmlidXRlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudERlY2wiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZiIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRSZWYiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnMiCi0gICAgICAgICAgICBuYW1lPSJYbWxFbGVtZW50UmVmcyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVsZW1lbnRXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzIgotICAgICAgICAgICAgbmFtZT0iWG1sRWxlbWVudHMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bSIKLSAgICAgICAgICAgIG5hbWU9IlhtbEVudW0iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlIgotICAgICAgICAgICAgbmFtZT0iWG1sRW51bVZhbHVlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEIgotICAgICAgICAgICAgbmFtZT0iWG1sSUQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSURSRUYiCi0gICAgICAgICAgICBuYW1lPSJYbWxJRFJFRiI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJbmxpbmVCaW5hcnlEYXRhIgotICAgICAgICAgICAgbmFtZT0iWG1sSW5saW5lQmluYXJ5RGF0YSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIiCi0gICAgICAgICAgICBuYW1lPSJYbWxKYXZhVHlwZUFkYXB0ZXIiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVycyIKLSAgICAgICAgICAgIG5hbWU9IlhtbEphdmFUeXBlQWRhcHRlcnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdCIKLSAgICAgICAgICAgIG5hbWU9IlhtbExpc3QiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUiCi0gICAgICAgICAgICBuYW1lPSJYbWxNaW1lVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZCIKLSAgICAgICAgICAgIG5hbWU9IlhtbE1peGVkIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE5zIgotICAgICAgICAgICAgbmFtZT0iWG1sTnMiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXhiLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnkiCi0gICAgICAgICAgICBuYW1lPSJYbWxSZWdpc3RyeSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbFJvb3RFbGVtZW50Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sU2NoZW1hVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlcyIKLSAgICAgICAgICAgIG5hbWU9IlhtbFNjaGVtYVR5cGVzIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28iCi0gICAgICAgICAgICBuYW1lPSJYbWxTZWVBbHNvIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4Yi5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudCIKLSAgICAgICAgICAgIG5hbWU9IlhtbFRyYW5zaWVudCI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlIgotICAgICAgICAgICAgbmFtZT0iWG1sVHlwZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheGIuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZSIKLSAgICAgICAgICAgIG5hbWU9IlhtbFZhbHVlIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY4ODE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpBWEJDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IAotICAgICAgICAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheGIuY29yZS5KQVhCQ29yZU1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUzsKLSAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU0NIRU1BX1RZUEVfTVVTVF9IQVZFX0RFRkFVTFRfT05fRklFTERfT1JfTUVUSE9EOwotCQotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpBWEJDb3JlTWVzc2FnZXMuY2xhc3MpOwotICAgIH0KLQotICAgIHByaXZhdGUgSkFYQkNvcmVNZXNzYWdlcygpIHsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDgxYmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZU1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZSBJbmMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI0pEVFV0aWxzCi1UWVBFX05BTUVfRElGRkVSRU5UX0NBU0VfRVhJU1RTPUEgVHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBjYXNlIGFscmVhZHkgZXhpc3RzCi1UWVBFX1dJVEhfTkFNRV9BTFJFQURZX0VYSVNUUz1BIGNvbXBpbGF0aW9uIHVuaXQgbmFtZWQgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cyBpbiBwYWNrYWdlICcnezF9JycKLVhNTF9TQ0hFTUFfVFlQRV9NVVNUX0hBVkVfREVGQVVMVF9PTl9GSUVMRF9PUl9NRVRIT0Q9SWYgQFhtbFNjaGVtYVR5cGUgaXMgdXNlZCBvbiBhIGZpZWxkIG9yIGEgbWV0aG9kLCB0aGVuIHRoZSB2YWx1ZSBvZiB0eXBlKCkgbXVzdCBiZSBERUZBVUxULmNsYXNzIChKQVhCIDIuMSwgOC42LjQuMikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXhiL2NvcmUvSkFYQkNvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjRkYjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheGIvY29yZS9KQVhCQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSkFYQkNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLSAgICBwcml2YXRlIHN0YXRpYyBKQVhCQ29yZVBsdWdpbiBwbHVnaW47Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBKQVhCQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKHNldmVyaXR5LCBKQVhCQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIEpBWEJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYQkNvcmVQbHVnaW4ubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYQkNvcmVQbHVnaW4uUExVR0lOX0lELCBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzBjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk3NzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2UwMDJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEZlYiAwMiAxMTo1MDo0MiBHTVQgMjAwOQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlZDE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtVmVyc2lvbjogMC41LjIucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtUmVnaXN0ZXJCdWRkeTogb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDEuNy4wKSIsCi0gamF2YXgueG1sLnNvYXA7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMi45LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMS41LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMsb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cyIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscwotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmFjdGl2YXRpb24sCi0gamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb247dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmh0dHA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5zb2FwO3ZlcnNpb249IjIuMS4wIiwKLSBvcmcuamRvbTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20uaW5wdXQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5qZG9tLm91dHB1dDt2ZXJzaW9uPSIxLjAuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTNlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxZWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPUpBWC1XUyBUb29scyAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2luY3ViYXRvci9cblwKLVxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWQ2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDg4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWFdTIENvcmUKLXBsdWdpbk5hbWU9SkFYLVdTIFRvb2xzIENvcmUgKEluY3ViYXRpb24pCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1XRUJTRVJWSUNFX0NMQVNTX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SX1JVTEU9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3QgYmUgYW4gb3V0ZXIgcHVibGljIGNsYXNzLCBtdXN0IG5vdCBiZSBmaW5hbCwgYW5kIG11c3Qgbm90IGJlIGFic3RyYWN0Ci1XRUJTRVJWSUNFX0NMQVNTX05PX0ZJTkFMSVpFX01FVEhPRF9SVUxFPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2UgbXVzdCBub3QgZGVmaW5lIGEgZmluYWxpemUoKSBtZXRob2QKLVdFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRV9BTk5OT1RBVElPTj1AV2ViTWV0aG9kIGFubm90YXRpb25zIG9ubHkgc3VwcG9ydGVkIGluIGNsYXNzZXMgd2l0aCB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9TRUlfTk9fV0VCTUVUSE9TX1JVTEU9Tm8gQFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBhbGxvd2VkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzIHRoYXQgY29udGFpbnMgYW4gZW5kcG9pbnRJbnRlcmZhY2UgYXR0cmlidXRlIGluIGl0J3MgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbgotV0VCU0VSVklDRV9PTl9TRUlfQVRUUklCVVRFU19SVUxFPUNlcnRhaW4gQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIHdoZW4gdXNlZCBvbiBTRUkncwotV0VCU0VSVklDRV9XRUJTRVJWSUNFX1BST1ZJREVSX0NPRVhJU1RfUlVMRT1AV2ViU2VydmljZSBhbmQgQFdlYlNlcnZpY2VQcm92aWRlciBhbm5vdGF0aW9ucyBjYW5ub3QgY29leGlzdAotT05FV0FZX05PX1JFVFVSTl9WQUxVRT1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgcmV0dXJuIGEgdmFsdWUKLVdFQk1FVEhPRF9PTkxZX1BVQkxJQ19NRVRIT0RTPU1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBtdXN0IGJlIHB1YmxpYywgYW5kIG11c3Qgbm90IGJlIGRlY2xhcmVkIHN0YXRpYyBvciBmaW5hbAotU09BUEJJTkRJTkdfUlVMRVM9QFNPQVBCaW5kaW5nIFJ1bGVzLiBFbmNvZGVkIHVzZSBub3Qgc3VwcG9ydGVkLiBObyBSUEMgc3R5bGUgb24gbWV0aG9kcy4gTm8gbWl4aW5nIG9mIFNPQVBCaW5kaW5nIHN0eWxlcy4gUlBDIHN0eWxlIG9ubHkgd2l0aCB3cmFwcGVkIHBhcmFtZXRlciBzdHlsZQotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEU9QFdlYk1ldGhvZCBleGNsdWRlIGF0dHJpYnV0ZSBpcyBub3QgYWxsb3dlZCBpbiBTRUkncy4gSWYgc3BlY2lmaWVkIGluIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLCB0aGVuIG90aGVyIGF0dHJpYnV0ZXMgaW4gdGhlIEBXZWJNZXRob2QgYW5ub3RhdGlvbiBhcmUgbm90IGFsbG93ZWQKLVNPQVBCSU5ESU5HX0RPQ1VNRU5UX0JBUkVfUlVMRVM9RG9jdW1lbnQgQmFyZSBvcGVyYXRpb25zIGFyZSBzdWJqZWN0IHRvIGEgbnVtYmVyIG9mIHJlc3RyaWN0aW9ucy4gQ29tYmluYXRpb25zIG9mIEBPbmV3YXkuIE5vdCBAT25ld2F5LiBWb2lkIFJldHVybi4gTm9uLVZvaWQgUmV0dXJuLiBAV2ViUGFyYW0gTW9kZXMgSU4sIE9VVCwgSU5PVVQuIEhlYWRlciBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRVNfUEFSQU1FVEVSU19SVUxFPVBhcmFtZXRlcnMgdGhhdCBjb25mb3JtIHRvIHRoZSBkZWZpbml0aW9uIG9mIEhvbGRlciBUeXBlcyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBXZWJQYXJhbS5Nb2RlLk9VVCBvciBAV2ViUGFyYW0uTW9kZS5JTk9VVAotVU5JUVVFX05BTUVTX1JVTEU9Q2hlY2tzIEBSZXNwb25zZVdyYXBwZXIsIEBSZXF1ZXN0V3JhcHBlciBhbmQgQFdlYkZhdWx0IEJlYW5zIGZvciB1bmlxdWUgY2xhc3NOYW1lIGFuZCBmYXVsdEJlYW4gYXR0cmlidXRlcwotSEFORExFUkNIQUlOX1JVTEVTPUBIYW5kbGVyQ2hhaW4gYW5kIEBTT0FQTWVzc2FnZUhhbmRsZXJzIGFubm90YXRpb25zIGNhbm5vdCBjb2V4aXN0LiBASGFuZGxlckNoYWluIGFsbG93ZWQgb24gVFlQRSBvbmx5Ci1XRUJTRVJWSUNFUkVGU19SVUxFUz1FYWNoIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gaW5zaWRlIGEgQFdlYlNlcnZpY2VSZWZzIG11c3QgY29udGFpbiBuYW1lIGFuZCB0eXBlIGVsZW1lbnRzIHdpdGggbm9uLWRlZmF1bHQgdmFsdWVzCi1XRUJTRVJWSUNFX1RBUkdFVF9OQU1FU1BBQ0VfUlVMRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAamF2YXguandzLldlYlNlcnZpY2UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IG5hbWVzcGFjZQotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEU9VGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24gYmVhbiBtdXN0IHJlbWFpbiBjb25zaXN0ZW50IHdpdGggdGhlIHBvcnRUeXBlIGFuZCBiaW5kaW5ncyBkZWNsYXJlZCBpbiB0aGlzIFdTREwgcmVmZXJlbmNlZCBpbiB0aGUgQFdlYlNlcnZpY2Uud3NkbExvY2F0aW9uIGF0dHJpYnV0ZQotV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTPUEgUHJvdmlkZXIgYmFzZWQgc2VydmljZSBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIFByb3ZpZGVyIGludGVyZmFjZSBhbmQgcHJvdmlkZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yCi1XRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEU9VmFsaWRhdGVzIE1ldGhvZCBQYXJhbWV0ZXJzIGFuZCBSZXR1cm4gVHlwZXMKLVdFQlNFUlZJQ0VfRUpCX1NUQVRFTEVTU19TRVNTSU9OPUBXZWJTZXJ2aWNlIG1heSBvbmx5IGJlIGFkZGVkIHRvIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW5zIGluIGFuIEVKQiBtb2R1bGUKLUpBWFdTX0NBVEVHT1JZX05BTUU9SkFYLVdTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmExMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuYW5ub3RhdGlvbkNhdGVnb3J5Ij4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJUpBWFdTX0NBVEVHT1JZX05BTUUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5hbm5vdGF0aW9uRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgbmFtZT0iV2ViU2VydmljZSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJNZXRob2QiCi0gICAgICAgICAgICBuYW1lPSJXZWJNZXRob2QiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuV2ViUGFyYW0iCi0gICAgICAgICAgICBuYW1lPSJXZWJQYXJhbSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4Lmp3cy5XZWJSZXN1bHQiCi0gICAgICAgICAgICBuYW1lPSJXZWJSZXN1bHQiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgbmFtZT0iSGFuZGxlckNoYWluIj4KLSAgICAgICAgIDx0YXJnZXRGaWx0ZXIgdGFyZ2V0PSJGSUVMRCIvPgotICAgICAgICAgPHRhcmdldEZpbHRlciB0YXJnZXQ9Ik1FVEhPRCIvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC5qd3MuT25ld2F5IgotICAgICAgICAgICAgbmFtZT0iT25ld2F5Ij4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBuYW1lPSJTT0FQQmluZGluZyI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZUNsaWVudCIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VDbGllbnQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZiIKLSAgICAgICAgICAgIG5hbWU9IldlYlNlcnZpY2VSZWYiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlUmVmcyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSIKLSAgICAgICAgICAgIG5hbWU9IlNlcnZpY2VNb2RlIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLldlYkZhdWx0IgotICAgICAgICAgICAgbmFtZT0iV2ViRmF1bHQiCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiCi0gICAgICAgICAgICBuYW1lPSJCaW5kaW5nVHlwZSIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5SZXF1ZXN0V3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlcXVlc3RXcmFwcGVyIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BvbnNlV3JhcHBlciIKLSAgICAgICAgICAgIG5hbWU9IlJlc3BvbnNlV3JhcHBlciI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5XZWJFbmRwb2ludCIKLSAgICAgICAgICAgIG5hbWU9IldlYkVuZHBvaW50IgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIgotICAgICAgICAgICAgbmFtZT0iUmVzcGVjdEJpbmRpbmciCi0gICAgICAgICAgICByZXN0cmljdGVkVG89IkNMQVNTX09OTFkiPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nIgotICAgICAgICAgICAgbmFtZT0iQWRkcmVzc2luZyIKLSAgICAgICAgICAgIHJlc3RyaWN0ZWRUbz0iQ0xBU1NfT05MWSI+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8YW5ub3RhdGlvbgotICAgICAgICAgICAgY2F0ZWdvcnk9ImpheHdzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9ImphdmF4LnhtbC53cy5zb2FwLk1UT00iCi0gICAgICAgICAgICBuYW1lPSJNVE9NIgotICAgICAgICAgICAgcmVzdHJpY3RlZFRvPSJDTEFTU19PTkxZIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLkZhdWx0QWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iRmF1bHRBY3Rpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGFubm90YXRpb24KLSAgICAgICAgICAgIGNhdGVnb3J5PSJqYXh3cy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJqYXZheC54bWwud3MuQWN0aW9uIgotICAgICAgICAgICAgbmFtZT0iQWN0aW9uIj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxhbm5vdGF0aW9uCi0gICAgICAgICAgICBjYXRlZ29yeT0iamF4d3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0iamF2YXgueG1sLndzLnNwaS5XZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iCi0gICAgICAgICAgICBuYW1lPSJXZWJTZXJ2aWNlRmVhdHVyZUFubm90YXRpb24iPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Qcm9jZXNzb3IiPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhPTERFUl9UWVBFU19QQVJBTUVURVJTX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5pcXVlTmFtZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVVTklRVUVfTkFNRVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUl9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9DTEFTU19QVUJMSUNfQUJTVFJBQ1RfRklOQUxfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfQ0xBU1NfTk9fRklOQUxJWkVfTUVUSE9EX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJTZXJ2aWNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfU0VJX05PX1dFQk1FVEhPU19SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJVdFQlNFUlZJQ0VfT05fU0VJX0FUVFJJQlVURVNfUlVMRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgCSVXRUJTRVJWSUNFX1dFQlNFUlZJQ0VfUFJPVklERVJfQ09FWElTVF9SVUxFCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFX0FOTk5PVEFUSU9OCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViTWV0aG9kIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJNRVRIT0RfT05MWV9QVUJMSUNfTUVUSE9EUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYk1ldGhvZEV4Y2x1ZGVSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5PbmV3YXkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5PbmV3YXlSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlT05FV0FZX05PX1JFVFVSTl9WQUxVRQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLnNvYXAuU09BUEJpbmRpbmciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTT0FQQklORElOR19ET0NVTUVOVF9CQVJFX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuSGFuZGxlckNoYWluIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb24uSGFuZGxlckNoYWluUnVsZXMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUhBTkRMRVJDSEFJTl9SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPiAgICAgCi0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuV2ViU2VydmljZVJlZnMiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUmVmc1J1bGVzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFUkVGU19SVUxFUwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvcHJvY2Vzc29yPgotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlVGFyZ2V0TmFtZXNwYWNlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9UQVJHRVRfTkFNRVNQQUNFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4KLSAgICAgIDxwcm9jZXNzb3IKLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRVBST1ZJREVSX1JVTEVTCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9wcm9jZXNzb3I+Ci0gICAgICA8cHJvY2Vzc29yCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC5qd3MuV2ViU2VydmljZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLldlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXRUJTRVJWSUNFX01FVEhPRF9QQVJBTUVURVJTX1JFVFVSTl9UWVBFX1JVTEUKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgICAgPHByb2Nlc3NvcgotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV0VCU0VSVklDRV9FSkJfU1RBVEVMRVNTX1NFU1NJT04KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3Byb2Nlc3Nvcj4gICAgIAotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNDc3MmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9Ci0gICAgICAgICJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9ESUZGRVJFTlRfQ0FTRV9FWElTVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBPTkVXQVlfTk9fUkVUVVJOX1ZBTFVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ORVdBWV9OT19DSEVDS0VEX0VYQ0VQVElPTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT05FV0FZX05PX0hPTERFUl9QQVJBTUVURVJTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSE9MREVSX1RZUEVfTVVTVF9CRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfSU5fUEFSQU1FVEVSOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSEFORExFUl9DSEFJTl9PTl9GSUVMRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQU5ETEVSX0NIQUlOX09OX01FVEhPRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVJFRlNfVFlQRV9SRVFVSVJFRDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX0ZJTkFMX01PRElGSUVSX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCTUVUSE9EX0VYQ0xVREVfTk9UX0FMTE9XRURfT05fU0VJOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0NMQVNTX09SX0lOVEVSRkFDRV9PTkxZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTkRQT0lOVElOVEVSRkFDRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9TRVJWSUNFTkFNRV9TRUk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0lOVEVSRkFDRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5EOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19TT0FQQklORElORzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fT05FV0FZOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT047Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX0RFRkFVTFRfUEFDS0FHRV9UQVJHRVRfTkFNRVNQQUNFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fU0VSVklDRV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19PUEVSVEFUSU9OX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1dTRExfT1BFUkFUSU9OX09VVFBVVF9NRVRIT0RfT05FV0FZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9TT0FQX0JJTkRJTkdfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19SUENfU1RZTEVfT05fTUVUSE9EUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNPQVBCSU5ESU5HX0RPQ1VNRU5UX0VOQ09ERURfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFUFJPVklERVJfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfSFRUUEJJTkRJTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfTkNOQU1FX0FUVFJJQlVURTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBBUkFNRVRFUl9OQU1FX0NMQVNIOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSDsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRVNfTk9UX1NVUFBPUlRFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBIQVNfSU5BRE1JU1NJQkxFX0lOTkVSX1RZUEVTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElTX1JFTU9URV9PQkpFQ1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUJTVFJBQ1RfQ0xBU1NfTk9UX0lNUExFTUVOVEVEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTVBMRU1FTlRTX01VTFRJUExFX0lOVEVSRkFDRVM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJQQVJBTV9OQU1FX1JFRFVOREFOVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJTRVJWSUNFX09OTFlfT05fU1RBVEVMRVNTX1NFU1NJT05fQkVBTlM7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU1QVFlfQVRUUklCVVRFX1ZBTFVFOwotICAgIHN0YXRpYyB7Ci0gICAgICAgIC8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0gICAgICAgIE5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpBWFdTQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEpBWFdTQ29yZU1lc3NhZ2VzKCkgewotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwZmYyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9KQVhXU0NvcmVNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNKRFRVdGlscwotVFlQRV9OQU1FX0RJRkZFUkVOVF9DQVNFX0VYSVNUUz1BIFR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBhbHJlYWR5IGV4aXN0cwotVFlQRV9XSVRIX05BTUVfQUxSRUFEWV9FWElTVFM9QSBjb21waWxhdGlvbiB1bml0IG5hbWVkICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gcGFja2FnZSAnJ3sxfScnCi0KLVdFQlNFUlZJQ0VfREVGQVVMVF9QVUJMSUNfQ09OU1RSVUNUT1I9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRV9DTEFTU19PUl9JTlRFUkZBQ0VfT05MWT1AV2ViU2VydmljZSBtYXkgb25seSBiZSBhZGRlZCB0byBhIGNsYXNzIG9yIGludGVyZmFjZQotV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUw9Q2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IGJlIGFuIG91dGVyIHB1YmxpYyBjbGFzcywgbXVzdCBub3QgYmUgZmluYWwsIGFuZCBtdXN0IG5vdCBiZSBhYnN0cmFjdAotV0VCU0VSVklDRV9PVkVSUklERV9GSU5BTElaRT1DbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlIG11c3Qgbm90IGRlZmluZSBhIGZpbmFsaXplKCkgbWV0aG9kCi1XRUJNRVRIT0RfT05MWV9TVVBQT1JURURfT05fQ0xBU1NFU19XSVRIX1dFQlNFUlZJQ0U9QFdlYk1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBjbGFzc2VzIGFubm90YXRlZCB3aXRoIEBXZWJTZXJ2aWNlCi1XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUz1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gbm9uLXB1YmxpYyBtZXRob2RzCi1XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRD1AV2ViTWV0aG9kIGFubm90YXRpb24gaXMgbm90IGFsbG93ZWQgb24gZmluYWwgbWV0aG9kcwotV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEPUBXZWJNZXRob2QgYW5ub3RhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBzdGF0aWMgbWV0aG9kcwotV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRD1AV2ViTWV0aG9kIGV4Y2x1ZGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZC4gTm8gb3RoZXIgYXR0cmlidXRlcyBhbGxvd2VkCi1XRUJNRVRIT0RfRVhDTFVERV9OT1RfQUxMT1dFRF9PTl9TRUk9QFdlYk1ldGhvZCBhbm5vdGF0aW9ucyBpbiBTRUkncyBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSB0aGUgZXhjbHVkZSBhdHRyaWJ1dGUKLVdFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJPUBXZWJTZXJ2aWNlIHNlcnZpY2VOYW1lIGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgb24gU0VJCi1XRUJTRVJWSUNFX0VORFBPSU5USU5URVJGQUNFX1NFST1AV2ViU2VydmljZSBlbmRwb2ludEludGVyZmFjZSBlbGVtZW50IGlzIG5vdCBhbGxvd2VkIG9uIFNFSQotV0VCU0VSVklDRV9QT1JUTkFNRV9TRUk9QFdlYlNlcnZpY2UgcG9ydE5hbWUgZWxlbWVudCBpcyBub3QgYWxsb3dlZCBvbiBTRUkKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9NVVNUX0lNUExFTUVOVD1JbXBsZW1lbnRhdGlvbiBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgU0VJIG1ldGhvZCAnJ3swfScnCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZPUNhbm5vdCByZWR1Y2UgdGhlIHZpc2liaWxpdHkgb2YgdGhlIFNFSSBtZXRob2QKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEU9VGhlIHJldHVybiB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHswfQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9JTlRFUkZBQ0U9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBJbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfRk9VTkQ9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgY2Fubm90IGJlIGZvdW5kCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0FOTk9UQVRFRD1UaGUgZW5kcG9pbnRJbnRlcmZhY2UgJyd7MH0nJyBtdXN0IGJlIGFubm90YXRlZCB3aXRoIEBqYXZheC5qd3MuV2ViU2VydmljZQotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9QVUJMSUM9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBwdWJsaWMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfT1VURVI9VGhlIGVuZHBvaW50SW50ZXJmYWNlICcnezB9JycgbXVzdCBiZSBhbiBvdXRlciBpbnRlcmZhY2UKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19OQU1FX0FUVFJJQlVURT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbmFtZSBhdHRyaWJ1dGUgYWxsb3dlZAotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFM9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIE5vIG1ldGhvZHMgYW5ub3RhdGVkIHdpdGggQFdlYk1ldGhvZCBhbGxvd2VkIGluIGltcGxlbWVudGF0aW9uIGNsYXNzCi1XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkc9QFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBjb250YWlucyBhbiBlbmRwb2ludEludGVyZmFjZSBhdHRyaWJ1dGUuIEBTT0FQQmluZGluZyBub3QgYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQlJFU1VMVD1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAV2ViUmVzdWx0IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gcGFyYW1ldGVycyBhbm5vdGF0ZWQgd2l0aCBAV2ViUGFyYW0gYWxsb3dlZCBpbiBpbXBsZW1lbnRhdGlvbiBjbGFzcwotV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWT1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGNvbnRhaW5zIGFuIGVuZHBvaW50SW50ZXJmYWNlIGF0dHJpYnV0ZS4gTm8gbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAT25ld2F5IGFsbG93ZWQgaW4gaW1wbGVtZW50YXRpb24gY2xhc3MKLVdFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OPUBXZWJTZXJ2aWNlIGFuZCBAV2ViU2VydmljZVByb3ZpZGVyIGFubm90YXRpb25zIGNhbm5vdCBiZSBjb21iaW5lZAotV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRT1DbGFzc2VzIG9yIEludGVyZmFjZXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBAV2ViU2VydmljZSBtdXN0IHNwZWNpZnkgYSB0YXJnZXROYW1lc3BhY2UgYXR0cmlidXRlCi1PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFPUBPbmV3YXkgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gYSB2YWx1ZQotT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUz1AT25ld2F5IG1ldGhvZHMgbXVzdCBub3QgZGVjbGFyZSBhbnkgY2hlY2tlZCBleGNlcHRpb25zCi1PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlM9QE9uZXdheSBtZXRob2RzIG11c3Qgbm90IGFjY2VwdCBhbnkgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzLiAKLVdFQlBBUkFNX01PREVfT1VUX0lOT1VUX0hPTERFUl9UWVBFPVRoZSBAV2ViUGFyYW0uTW9kZS5PVVQgYW5kIEBXZWJQYXJhbS5Nb2RlLklOT1VUIG1vZGVzIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgamF2YXgueG1sLndzLkhvbGRlcjxUPiBwYXJhbWV0ZXJzCi1IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVD1qYXZheC54bWwud3MuSG9sZGVyPFQ+IHBhcmFtZXRlcnMgbXVzdCBiZSBAV2ViUGFyYW0uTW9kZS5PVVQgb3IgQFdlYlBhcmFtLk1vZGUuSU5PVVQKLVNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTPVJQQyBzdHlsZSBAU09BUEJpbmRpbmcgYW5ub3RhdGlvbnMgbm90IHN1cHBvcnRlZCBvbiBtZXRob2RzCi1TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPVJQQyBFbmNvZGVkIFNPQVAgQmluZGluZ3Mgbm90IHN1cHBvcnRlZAotU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEPURvY3VtZW50IEVuY29kZWQgU09BUCBCaW5kaW5ncyBub3Qgc3VwcG9ydGVkCi1TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUz1NaXhlZCBSUEMgYW5kIERvY3VtZW50IHN0eWxlIG9wZXJhdGlvbnMgbm90IHBlcm1pdHRlZCBpbiB0aGUgc2FtZSBzZXJ2aWNlCi1TT0FQQklORElOR19SUENfTk9fQkFSRV9QQVJBTUVURVJfU1RZTEU9VXNlIG9mIFJQQyBzdHlsZSByZXF1aXJlcyB1c2Ugb2YgV1JBUFBFRCBwYXJhbWV0ZXIgc3R5bGUKLURPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIG1heSBoYXZlIG9ubHkgb25lIG5vbi1oZWFkZXIgSU4gcGFyYW1ldGVyCi1ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSBub24tdm9pZCByZXR1cm4gdmFsdWUgbWF5IG5vdCBoYXZlIGFueSBPVVQgb3IgSU5PVVQgcGFyYW1ldGVycwotRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUj1Eb2N1bWVudCBsaXRlcmFsIGJhcmUgbWV0aG9kcyB0aGF0IGRlY2xhcmUgYSB2b2lkIHJldHVybiB2YWx1ZSBtYXkgaGF2ZSBvbmx5IG9uZSBJTi9JTk9VVCBwYXJhbWV0ZXIKLURPQ19CQVJFX1ZPSURfUkVUVVJOX09ORV9PVVRfUEFSQU1FVEVSPURvY3VtZW50IGxpdGVyYWwgYmFyZSBtZXRob2RzIHRoYXQgZGVjbGFyZSBhIHZvaWQgcmV0dXJuIHZhbHVlIG1heSBoYXZlIG9ubHkgb25lIE9VVC9JTk9VVCBwYXJhbWV0ZXIKLVdFQlBBUkFNX05BTUVfUkVRVUlSRURfV0hFTl9ET0NfQkFSRV9PVVRfSU5PVVQ9VGhlIEBXZWJQYXJhbSBuYW1lIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgRG9jdW1lbnQgQmFyZSBhbmQgdGhlIG1vZGUgaXMgT1VUIG9yIElOT1VUCi1PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1I9T3BlcmF0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlIDogJyd7MH0nJwotV1JBUFBFUl9GQVVMVF9CRUFOX05BTUVTX01VU1RfQkVfVU5JUVVFPUdlbmVyYXRlZCBSZXF1ZXN0L1Jlc3BvbnNlIGFuZCBGYXVsdCBiZWFuIGNsYXNzZXMgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyB3aXRoaW4gYSBwYWNrYWdlIGFuZCBtdXN0IG5vdCBjbGFzaCB3aXRoIG90aGVyIGNsYXNzZXMgaW4gdGhhdCBwYWNrYWdlIDogJyd7MH0nJwotRE9DX0JBUkVfTUVUSE9EU19VTklRVUVfWE1MX0VMRU1FTlRTPURvY3VtZW50IExpdGVyYWwgQmFyZSBvcGVyYXRpb25zIG11c3QgaGF2ZSB1bmlxdWUgWE1MIGVsZW1lbnRzIGZvciB0aGUgaW5wdXQgYW5kIG91dHB1dCBtZXNzYWdlcyBhY3Jvc3MgYWxsIG9wZXJhdGlvbnMgb24gdGhlIFdlYiBTZXJ2aWNlIDogJyd7MH0nJwotTE9DQUxfTkFNRV9BVFRSSUJVVEVTX01VU1RfQkVfVU5JUVVFPVRoZSB3cmFwcGVyIGJlYW4gbG9jYWxOYW1lIGF0dHJpYnV0ZXMgbXVzdCBiZSB1bmlxdWUgOiAnJ3swfScnCi1JTlZBTElEX05DTkFNRV9BVFRSSUJVVEU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSB2YWx1ZSAnJ3syfScnIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1VOQUJMRV9UT19MT0NBVEU9VW5hYmxlIHRvIGxvY2F0ZSB3c2RsIGF0IHdzZGxMb2NhdGlvbjogJyd7MH0nJwotV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRT1ObyB3c2RsOnBvcnQgbWF0Y2hpbmcgdGhlIHBvcnROYW1lICcnezB9JycgY2FuIGJlIGZvdW5kIGluIHRoZSBXU0RMICcnezF9JycKLVdFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9OT19TRVJWSUNFX05BTUU9Tm8gd3NkbDpzZXJ2aWNlIG1hdGNoaW5nIHRoZSBzZXJ2aWNlTmFtZSAnJ3swfScnIGNhbiBiZSBmb3VuZCBpbiB0aGUgV1NETCAnJ3sxfScnCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fTk9fT1BFUlRBVElPTl9OQU1FPU5vIEBXZWJNZXRob2QgbWF0Y2hpbmcgdGhlIHdzZGw6b3BlcmF0aW9uICcnezB9JycgY2FuIGJlIGZvdW5kCi1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fV1NETF9PUEVSQVRJT05fT1VUUFVUX01FVEhPRF9PTkVXQVk9VGhlIE1ldGhvZCAnJ3swfScnIGlzIGFubm90YXRlZCBAT25ld2F5IGJ1dCB0aGUgd3NkbDpvcGVyYXRpb24gJyd7MH0nJyBzcGVjaWZpZXMgYSB3c2RsOm91dHB1dCBlbGVtZW50Ci1XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFPVRoZSB3c2RsICcnezB9Jycgc3BlY2lmaWVzIGEgJyd7MX0nJyBTT0FQIGJpbmRpbmcgc3R5bGUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICcnezJ9JycgU09BUCBiaW5kaW5nIHN0eWxlIG9mIHRoZSB3ZWIgc2VydmljZSBpbXBsZW1lbnRhdGlvbi9TRUkKLVBBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIHVuaXF1ZTogJyd7MH0nJwotR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNIPVBhcmFtZXRlciBOYW1lICcnezB9Jycgd2lsbCBjbGFzaCB3aXRoIGEgZ2VuZXJhdGVkIHBhcmFtZXRlciBuYW1lCi1IQU5ETEVSX0NIQUlOX1NPQVBfTUVTU0FHRV9IQU5ETEVSUz1ASGFuZGxlckNoYWluIGFuZCBAU09BUE1lc3NhZ2VIYW5kbGVycyBjYW5ub3QgYmUgY29tYmluZWQKLUhBTkRMRVJfQ0hBSU5fT05fRklFTEQ9VGhlIEBIYW5kbGVyQ2hhaW4gYW5ub3RhdGlvbiBtYXkgb25seSBiZSBzcGVjaWZpZWQgb24gYSBUWVBFLiBUaGUgYW5ub3RhdGlvbiB0YXJnZXQgaW5jbHVkZXMgRklFTEQgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1IQU5ETEVSX0NIQUlOX09OX01FVEhPRD1UaGUgQEhhbmRsZXJDaGFpbiBhbm5vdGF0aW9uIG1heSBvbmx5IGJlIHNwZWNpZmllZCBvbiBhIFRZUEUuIFRoZSBhbm5vdGF0aW9uIHRhcmdldCBpbmNsdWRlcyBNRVRIT0QgZm9yIHVzZSBieSBKQVgtV1MgMi4wCi1XRUJTRVJWSUNFUkVGU19OQU1FX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgbmFtZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoIiIpIHZhbHVlCi1XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEPUVhY2ggQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBpbnNpZGUgYSBAV2ViU2VydmljZVJlZnMgbXVzdCBjb250YWluIGEgdHlwZSBlbGVtZW50IHdpdGggYSBub24tZGVmYXVsdCAoT2JqZWN0LmNsYXNzKSB2YWx1ZQotV0VCU0VSVklDRVBST1ZJREVSX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SPUNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFdlYlNlcnZpY2VQcm92aWRlciBtdXN0IGhhdmUgYSBkZWZhdWx0IHB1YmxpYyBjb25zdHJ1Y3RvcgotV0VCU0VSVklDRVBST1ZJREVSX0lNUExFTUVOVF9UWVBFRF9QUk9WSURFUl9JTlRFUkZBQ0U9QSBQcm92aWRlciBiYXNlZCBlbmRwb2ludCBpbXBsZW1lbnRhdGlvbiBtdXN0IGltcGxlbWVudCBhIHR5cGVkIGphdmF4LnhtbC53cy5Qcm92aWRlciBpbnRlcmZhY2UuIFByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyB3b3JrIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBvYmplY3RzOiBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSwgamF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2UgYW5kIGphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZQotV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HPWphdmF4LnhtbC5zb2FwLlNPQVBNZXNzYWdlIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBTT0FQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9TT0FQTUVTU0FHRV9NRVNTQUdFX01PREU9amF2YXgueG1sLnNvYXAuU09BUE1lc3NhZ2Ugb2JqZWN0cyByZXF1aXJlIHRoZSBQcm92aWRlciBpbXBsZW1lbnRhdGlvbiB0byBzcGVjaWZ5IGEgQGphdmF4LnhtbC53cy5TZXJ2aWNlTW9kZSBhbm5vdGF0aW9uIHdpdGggamF2YXgueG1sLndzLlNlcnZpY2UuTW9kZS5NRVNTQUdFIGFzIHRoZSB2YWx1ZSAKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX0hUVFBCSU5ESU5HPWphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZSBkZXJpdmVkIG9iamVjdHMgcmVxdWlyZSB0aGUgUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBIVFRQIEJpbmRpbmcKLVdFQlNFUlZJQ0VQUk9WSURFUl9EQVRBU09VUkNFX01FU1NBR0VfTU9ERT1qYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2UgZGVyaXZlZCBvYmplY3RzIHJlcXVpcmUgdGhlIFByb3ZpZGVyIGltcGxlbWVudGF0aW9uIHRvIHNwZWNpZnkgYSBAamF2YXgueG1sLndzLlNlcnZpY2VNb2RlIGFubm90YXRpb24gd2l0aCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlLk1FU1NBR0UgYXMgdGhlIHZhbHVlCi1FTVBUWV9BVFRSSUJVVEVfVkFMVUU9VGhlIEB7MH0gezF9IGF0dHJpYnV0ZSBzaG91bGQgbm90IGJlIGVtcHR5Ci1XRUJQQVJBTV9OQU1FX1JFRFVOREFOVD1OYW1lIGF0dHJpYnV0ZSBpcyBub3QgdXNlZCBpZiBTT0FQQmluZGluZy5TdHlsZSBpcyBSUEMgYW5kIHBhcnROYW1lIGlzIHByZXNlbnQKLVdFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUz1AV2ViU2VydmljZSBhbm5vdGF0aW9uIGluIEVKQiBtb2R1bGVzIGNhbiBiZSBvbmx5IHVzZWQgb24gc3RhdGVsZXNzIHNlc3Npb24gYmVhbnMKLVdFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfRVhDRVBUSU9OUz1NZXRob2QgezB9IGRlY2xhcmVzIGV4Y2VwdGlvbnMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgdGhyb3dzIGNsYXVzZSBvZiB0aGUgezB9IG1ldGhvZCBpbiB0aGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UgezF9Ci1JTlRFUkZBQ0VTX05PVF9TVVBQT1JURUQ9ezB9IGlzIGFuIGludGVyZmFjZSBhbmQgbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBKQVhCIGNhbm5vdCBoYW5kbGUgaW50ZXJmYWNlcwotSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUz1DbGFzcyB7MH0gbWF5IG5vdCBiZSB1c2VkIGFzIGEgcmV0dXJuIHR5cGUgb3IgbWV0aG9kIHBhcmFtZXRlciBhcyBpdCBoYXMgaW5uZXIgdHlwZXMgdGhhdCBhcmUgbm90IHB1YmxpYyBhbmQgc3RhdGljCi1JU19SRU1PVEVfT0JKRUNUPUNsYXNzIHswfSBpcyBhIHJlbW90ZSBPYmplY3QgYW5kIG1heSBub3QgdXNlZCBhcyBhIG1ldGhvZCByZXR1cm4gdHlwZSBvciBwYXJhbWV0ZXIKLUFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRD1BYnN0cmFjdCBjbGFzcyB7MH0gY2Fubm90IGJlIHVzZWQgYXMgYSBydW50aW1lIGNsYXNzIGJlY2F1c2UgaXQgaXMgbm90IGV4dGVuZGVkIGJ5IGEgbm9uIGFic3RyYWN0IGNsYXNzIHdoaWNoIGlzIHN1aXRhYmxlIGFzIGEgcnVudGltZSBjbGFzcwotSU5IRVJJVEFOQ0VfQU5EX0lNUExFTUVOVEFUSU9OPUNsYXNzIHswfSBleHRlbmRzIHsxfSBhbmQgaW1wbGVtZW50cyBpbnRlcmZhY2UgezJ9IChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLUlNUExFTUVOVFNfTVVMVElQTEVfSU5URVJGQUNFUz1DbGFzcyB7MH0gaW1wbGVtZW50cyBtdWx0aXBsZSBpbnRlcmZhY2VzIChtdWx0aXBsZSBpbmhlcml0YW5jZSBpcyBub3QgYWxsb3dlZCkKLVRBUkdFVF9OQU1FU1BBQ0VfVVJJX1NZTlRBWF9FUlJPUj1VUkkgc3ludGF4IGVycm9yIGF0IGluZGV4IHswfSBvZiBpbnB1dCBTdHJpbmcgJyd7MX0nJy4gUmVhc29uOiB7Mn0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL0pBWFdTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTI3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvSkFYV1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0gICAgcHJpdmF0ZSBzdGF0aWMgSkFYV1NDb3JlUGx1Z2luIHBsdWdpbjsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEpBWFdTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotICAgICAgcmV0dXJuIHBsdWdpbjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0gICAgICAgIHBsdWdpbiA9IHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBwbHVnaW4gPSBudWxsOwotICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobmV3IFN0YXR1cyhzZXZlcml0eSwgSkFYV1NDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLSAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbikpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vSGFuZGxlckNoYWluUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZmU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hhbmRsZXJDaGFpblJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZheC5qd3MuSGFuZGxlckNoYWluOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRmllbGREZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgSGFuZGxlckNoYWluUnVsZXMgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oSGFuZGxlckNoYWluLmNsYXNzLmdldE5hbWUoKSk7DQotDQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50DQotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLnNvYXAuU09BUE1lc3NhZ2VIYW5kbGVycy5jbGFzcyk7DQotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTWlycm9yICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sDQotICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguandzLkhhbmRsZXJDaGFpbi5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoYW5ub3RhdGlvbk1pcnJvci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkhBTkRMRVJfQ0hBSU5fT05fRklFTEQpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qd3MuSGFuZGxlckNoYWluLmNsYXNzKTsNCi0NCi0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uTWlycm9yLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9PTl9NRVRIT0QpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9Ib2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZWQyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL0hvbGRlclR5cGVQYXJhbWV0ZXJzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLkhvbGRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBIb2xkZXJUeXBlUGFyYW1ldGVyc1J1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgIHZhbGlkYXRlUGFyYW1ldGVycygoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhcmFtZXRlcnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzSG9sZGVyUGFyYW1ldGVyID0gdHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXZWJQYXJhbU91dElub3V0TW9kZShwYXJhbWV0ZXIpICYmICFpc0hvbGRlclBhcmFtZXRlcikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHBhcmFtZXRlci5nZXRQb3NpdGlvbigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNIb2xkZXJQYXJhbWV0ZXIgJiYgaXNXZWJQYXJhbUluTW9kZShwYXJhbWV0ZXIpKXsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXIuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5IT0xERVJfVFlQRV9NVVNUX0JFX09VVF9JTk9VVCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtSW5Nb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuSU4udG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlBhcmFtT3V0SW5vdXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBTdHJpbmcgbW9kZSA9IGdldE1vZGUocGFyYW1ldGVyKTsKLSAgICAgICAgaWYgKG1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1vZGUuZXF1YWxzKFdlYlBhcmFtLk1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoV2ViUGFyYW0uTW9kZS5JTk9VVC5uYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRNb2RlKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlcikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlBhcmFtLCBNT0RFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vT25ld2F5UnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL09uZXdheVJ1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKE9uZXdheS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhlbnZpcm9ubWVudC5nZXRUeXBlVXRpbHMoKS5nZXRWb2lkVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fUkVUVVJOX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIG9uZXdheSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBPbmV3YXkuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fQ0hFQ0tFRF9FWENFUFRJT05TKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tQYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgIGlmICh0eXBlTWlycm9yLnRvU3RyaW5nKCkuZXF1YWxzKEhvbGRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5PTkVXQVlfTk9fSE9MREVSX1BBUkFNRVRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ0RvY3VtZW50QmFyZVJ1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmY2NiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1NPQVBCaW5kaW5nRG9jdW1lbnRCYXJlUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkhFQURFUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdEb2N1bWVudEJhcmVSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUobWlycm9yKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLmdldERlY2xhcmF0aW9uKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKG1pcnJvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzTWV0aG9kKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNZXRob2QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLQotICAgICAgICAvL0BPbmV3YXkgb3BlcmF0aW9ucwotICAgICAgICBpZiAoaXNPbmV3YXkobWV0aG9kRGVjbGFyYXRpb24pICYmICFpc1NpbmdsZU5vbkhlYWRlcklOUGFyYW1ldGVyKHBhcmFtZXRlcnMpKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05MWV9PTkVfTk9OX0hFQURFUl9JTl9QQVJBTUVURVIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGlzVm9pZFJldHVyblR5cGUobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50SU5QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb3VudE9VVFBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9WT0lEX1JFVFVSTl9PTkVfT1VUX1BBUkFNRVRFUik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50T1VUUGFyYW1ldGVycyhwYXJhbWV0ZXJzKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfTk9OX1ZPSURfUkVUVVJOX05PX0lOT1VUX09VVF9QQVJBTUVURVIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vY2hlY2sgZm9yIEBXZWJQYXJhbS5uYW1lIGF0dHJpYnV0ZSB3aGVuIEBXZWJQYXJhbS5Nb2RlID0gT1VUIG9yIElOT1VUCi0vLyAgICAgICAgZm9yKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotLy8gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotLy8gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk1pcnJvciAhPSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZShhbm5vdGF0aW9uTWlycm9yLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0vLyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBOQU1FKTsKLS8vCi0vLyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsICYmIChtb2RlLmVxdWFscyhNb2RlLk9VVC5uYW1lKCkpIHx8IG1vZGUuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkpIHsKLS8vICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25NaXJyb3IuZ2V0UG9zaXRpb24oKSwKLS8vICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJQQVJBTV9OQU1FX1JFUVVJUkVEX1dIRU5fRE9DX0JBUkVfT1VUX0lOT1VUKTsKLS8vICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgfQotLy8gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNPbmV3YXkoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVm9pZFJldHVyblR5cGUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlTm9uSGVhZGVySU5QYXJhbWV0ZXIoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICByZXR1cm4gY291bnROb25IZWFkZXJJTlBhcmFtZXRlcnMocGFyYW1ldGVycykgPD0gMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudE5vbkhlYWRlcklOUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBpbk5vbkhlYWRlclBhcmFtZXRlcnMgPSAwOwotICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgaWYgKGlzTm9uSGVhZGVySU5QYXJhbWV0ZXIocGFyYW1ldGVyRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluTm9uSGVhZGVyUGFyYW1ldGVyczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNOb25IZWFkZXJJTlBhcmFtZXRlcihQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpCi0gICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU4ubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgY291bnRJTlBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBpbnQgaW5Ob25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc0lOUGFyYW1ldGVyKHBhcmFtZXRlckRlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgIGluTm9uSGVhZGVyUGFyYW1ldGVycysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbk5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSU5QYXJhbWV0ZXIoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgcmV0dXJuIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICAgICAmJiAhaXNIZWFkZXIod2ViUGFyYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGRlZmF1bHRNb2RlID0gZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbik7Ci0gICAgICAgIGlmIChkZWZhdWx0TW9kZS5lcXVhbHMoTW9kZS5JTi5uYW1lKCkpIHx8IGRlZmF1bHRNb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGNvdW50T1VUUGFyYW1ldGVycyhDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGludCBvdXROb25IZWFkZXJQYXJhbWV0ZXJzID0gMDsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIGlmIChpc09VVFBhcmFtZXRlcihwYXJhbWV0ZXJEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBvdXROb25IZWFkZXJQYXJhbWV0ZXJzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dE5vbkhlYWRlclBhcmFtZXRlcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzT1VUUGFyYW1ldGVyKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICBpZiAod2ViUGFyYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAobW9kZS5lcXVhbHMoTW9kZS5PVVQubmFtZSgpKSB8fCBtb2RlLmVxdWFscyhNb2RlLklOT1VULm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgICYmICFpc0hlYWRlcih3ZWJQYXJhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0RGVmYXVsdFdlYlBhcmFtTW9kZShwYXJhbWV0ZXJEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuSU5PVVQubmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGVhZGVyKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvcikgewotICAgICAgICBCb29sZWFuIGhlYWRlciA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgSEVBREVSKTsKLSAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vU09BUEJpbmRpbmdSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZTRlNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9TT0FQQmluZGluZ1J1bGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJBTUVURVJfU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNUWUxFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlVTRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gc29hcEJpbmRpbmdEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFNPQVBCaW5kaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChzb2FwQmluZGluZ0RlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGNoZWNrRm9yRW5jb2RlZFVzZShkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgY2hlY2tGb3JSUENCYXJlT25UeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZSh0eXBlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrRm9yUlBDU3R5bGVPbk1ldGhvZERlY2xhcmF0aW9uKChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUlBDQmFyZU9uVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUuZXF1YWxzKFN0eWxlLlJQQy50b1N0cmluZygpKSkgewotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgaWYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICBwcmludEVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19OT19CQVJFX1BBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBmb3IgRG9jdW1lbnQgc3R5bGUgQFNPQVBCaW5kaW5nIG9uIG1ldGhvZHMKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAoc29hcEJpbmRpbmcyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlMiA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzb2FwQmluZGluZzIsIFNUWUxFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlMiA9PSBudWxsIHx8IHN0eWxlMi5lcXVhbHMoU3R5bGUuRE9DVU1FTlQudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcyLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX01JWEVEX0JJTkRJTkdTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvckVuY29kZWRVc2UoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBzb2FwQmluZGluZyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFVTRSk7Ci0gICAgICAgIGlmICh1c2UgIT0gbnVsbCAmJiB1c2UuZXF1YWxzKFVzZS5FTkNPREVELnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmcsIFNUWUxFKTsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmcuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfRE9DVU1FTlRfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19SUENfRU5DT0RFRF9OT1RfU1VQUE9SVEVEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0ZvclJQQ1N0eWxlT25NZXRob2REZWNsYXJhdGlvbihNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNvYXBCaW5kaW5nLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlZHVuZGFudFdlYlBhcmFtTmFtZUF0dHJpYnV0ZShUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHNvYXBCaW5kaW5nLCBTVFlMRSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmVxdWFscyhTdHlsZS5SUEMudG9TdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwgJiYgIWlzSGVhZGVyKHdlYlBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBhcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgUEFSVF9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlBhcmFtLCBOQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50V2FybmluZyhuYW1lLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlBBUkFNX05BTUVfUkVEVU5EQU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vVW5pcXVlTmFtZXNSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjNlNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9VbmlxdWVOYW1lc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRkFVTFRfQkVBTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5NT0RFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5SRVNQT05TRV9TVUZGSVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLlJlcXVlc3RXcmFwcGVyOwotaW1wb3J0IGphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXI7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYkZhdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMudXRpbC5YTUxDaGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuUmVmZXJlbmNlVHlwZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudXRpbC5Tb3VyY2VQb3NpdGlvbjsKLQotcHVibGljIGNsYXNzIFVuaXF1ZU5hbWVzUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJhcmdcXGQrKyIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHdlYlNlcnZpY2VEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hbWVBdHRyaWJ1dGVzKHR5cGVEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgY2hlY2tPcGVyYXRpb25OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja1dyYXBwZXJBbmRGYXVsdEJlYW5OYW1lcyh0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKTsKLSAgICAgICAgICAgICAgICBjaGVja0RvY3VtZW50QmFyZU1ldGhvZHModHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKSk7Ci0gICAgICAgICAgICAgICAgY2hlY2tNZXRob2RQYXJhbWV0ZXJzKHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZUF0dHJpYnV0ZXMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlNlcnZpY2UsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgUE9SVF9OQU1FKTsKLSAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJTZXJ2aWNlLCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgU0VSVklDRV9OQU1FKTsKLQotICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZERlY2xhcmF0aW9uLCBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJNZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIE9QRVJBVElPTl9OQU1FKTsKLQotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVWYWx1ZSh3ZWJQYXJhbSwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBOQU1FKTsKLSAgICAgICAgICAgICAgICBjaGVja0F0dHJpYnV0ZVZhbHVlKHdlYlBhcmFtLCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIFBBUlRfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGFubm90YXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihhbm5vdGF0aW9uVmFsdWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5FTVBUWV9BVFRSSUJVVEVfVkFMVUUsIG5ldyBPYmplY3RbXSB7IGFubm90YXRpb25OYW1lLCBhdHRyaWJ1dGVOYW1lIH0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFYTUxDaGFyLmlzVmFsaWROYW1lKGFubm90YXRpb25WYWx1ZS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGFubm90YXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOVkFMSURfTkNOQU1FX0FUVFJJQlVURSwgbmV3IE9iamVjdFtdIHsgYW5ub3RhdGlvbk5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lLCAgYW5ub3RhdGlvblZhbHVlLnRvU3RyaW5nKCkgfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja09wZXJhdGlvbk5hbWVzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+IG5hbWVNYXAgPSBuZXcgSGFzaE1hcDxEZWNsYXJhdGlvbiwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2RzKSB7Ci0gICAgICAgICAgICBuYW1lTWFwLnB1dChtZXRob2REZWNsYXJhdGlvbiwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLAotICAgICAgICAgICAgICAgICAgICBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZERlY2xhcmF0aW9uKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgRGVjbGFyYXRpb25bXSBrZXlzID0gbmFtZU1hcC5rZXlTZXQoKS50b0FycmF5KG5ldyBEZWNsYXJhdGlvbltuYW1lTWFwLnNpemUoKV0pOwotICAgICAgICBRTmFtZVtdIHZhbHVlcyA9IG5hbWVNYXAudmFsdWVzKCkudG9BcnJheShuZXcgUU5hbWVbbmFtZU1hcC5zaXplKCldKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUU5hbWUgcU5hbWUgPSB2YWx1ZXNbaV07Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCB2YWx1ZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBRTmFtZSBvdGhlclFOYW1lID0gdmFsdWVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChxTmFtZS5lcXVhbHMob3RoZXJRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihrZXlzW2ldLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuT1BFUkFUSU9OX05BTUVTX01VU1RfQkVfVU5JUVVFX0VSUk9SLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGtleXNbal0uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5PUEVSQVRJT05fTkFNRVNfTVVTVF9CRV9VTklRVUVfRVJST1IsIG90aGVyUU5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb24sIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXcmFwcGVyQW5kRmF1bHRCZWFuTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihSZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gcmVzcG9zZVdyYXBwZXJEZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIFNldDxEZWNsYXJhdGlvbj4gbWV0aG9kcyA9IG5ldyBIYXNoU2V0PERlY2xhcmF0aW9uPigpOwotICAgICAgICBtZXRob2RzLmFkZEFsbChlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHJlcXVlc3RXcmFwcGVyRGVjbGFyYXRpb24pKTsKLSAgICAgICAgbWV0aG9kcy5hZGRBbGwoZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChyZXNwb3NlV3JhcHBlckRlY2xhcmF0aW9uKSk7Ci0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25WYWx1ZT4oKTsKLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciByZXF1ZXN0V3JhcHBlciA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBSZXF1ZXN0V3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RXcmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3NOYW1lKHJlcXVlc3RXcmFwcGVyLCBDTEFTU19OQU1FLCBjbGFzc05hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkTG9jYWxOYW1lKHJlcXVlc3RXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgcmVzcG9uc2VXcmFwcGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFJlc3BvbnNlV3JhcHBlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlV3JhcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENsYXNzTmFtZShyZXNwb25zZVdyYXBwZXIsIENMQVNTX05BTUUsIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgICAgICBhZGRMb2NhbE5hbWUocmVzcG9uc2VXcmFwcGVyLCBMT0NBTF9OQU1FLCAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNldDxSZWZlcmVuY2VUeXBlPiB0aHJvd25UeXBlcyA9IG5ldyBIYXNoU2V0PFJlZmVyZW5jZVR5cGU+KCk7Ci0KLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgdGhyb3duVHlwZXMuYWRkQWxsKG1ldGhvZERlY2xhcmF0aW9uLmdldFRocm93blR5cGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChSZWZlcmVuY2VUeXBlIHJlZmVyZW5jZVR5cGUgOiB0aHJvd25UeXBlcykgewotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZVR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIHJlZmVyZW5jZVR5cGU7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJGYXVsdCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIFdlYkZhdWx0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBpZiAod2ViRmF1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZGRDbGFzc05hbWUod2ViRmF1bHQsIEZBVUxUX0JFQU4sIGNsYXNzTmFtZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGkpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgY2xhc3NOYW1lcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBvdGhlckNsYXNzTmFtZSA9IGNsYXNzTmFtZXMuZ2V0KGopOwotICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJDbGFzc05hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGNsYXNzTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldSQVBQRVJfRkFVTFRfQkVBTl9OQU1FU19NVVNUX0JFX1VOSVFVRSwgY2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iob3RoZXJDbGFzc05hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XUkFQUEVSX0ZBVUxUX0JFQU5fTkFNRVNfTVVTVF9CRV9VTklRVUUsIG90aGVyQ2xhc3NOYW1lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5MT0NBTF9OQU1FX0FUVFJJQlVURVNfTVVTVF9CRV9VTklRVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVFOYW1lcyhNYXA8T2JqZWN0LCBRTmFtZT4gcU5hbWVzLCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0gICAgICAgIE9iamVjdFtdIGtleXMgPSAgcU5hbWVzLmtleVNldCgpLnRvQXJyYXkobmV3IE9iamVjdFtxTmFtZXMuc2l6ZSgpXSk7Ci0gICAgICAgIFFOYW1lW10gdmFsdWVzID0gcU5hbWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IFFOYW1lW3FOYW1lcy5zaXplKCldKTsKLQotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IHZhbHVlc1tpXTsKLSAgICAgICAgICAgIGZvcihpbnQgaiA9IGkgKyAxOyBqIDwgdmFsdWVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgb3RoZXJRTmFtZSA9IHZhbHVlc1tqXTsKLSAgICAgICAgICAgICAgICBpZiAocU5hbWUuZXF1YWxzKG90aGVyUU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZ2V0UG9zaXRpb24oa2V5c1tpXSksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoZXJyb3JNZXNzYWdlLCBxTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGdldFBvc2l0aW9uKGtleXNbal0pLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKGVycm9yTWVzc2FnZSwgb3RoZXJRTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWUoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBTdHJpbmcgYXR0cmlidXRlS2V5LAotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IGNsYXNzTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIGNsYXNzTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwgYXR0cmlidXRlS2V5KTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZExvY2FsTmFtZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFN0cmluZyBhdHRyaWJ1dGVLZXksCi0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBBbm5vdGF0aW9uVmFsdWUgbG9jYWxOYW1lVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIGF0dHJpYnV0ZUtleSk7Ci0gICAgICAgIGlmIChsb2NhbE5hbWVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KGxvY2FsTmFtZVZhbHVlLCBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKGFubm90YXRpb25NaXJyb3IsIG1ldGhvZERlY2xhcmF0aW9uKSwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tEb2N1bWVudEJhcmVNZXRob2RzKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IGRvY0JhcmVNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2REZWNsYXJhdGlvbj4oKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIGlmIChoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBkb2NCYXJlTWV0aG9kcy5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgUU5hbWU+KCk7Ci0gICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBkb2NCYXJlTWV0aG9kcykgewotICAgICAgICAgICAgZ2V0RG9jdW1lbnRCYXJlT3BlcmF0aW9uUmVxdWVzdChtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlc3BvbnNlKG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFsaWRhdGVRTmFtZXMocU5hbWVzLCBKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9NRVRIT0RTX1VOSVFVRV9YTUxfRUxFTUVOVFMpOwotICAgIH0KLQotICAgIHByaXZhdGUgU291cmNlUG9zaXRpb24gZ2V0UG9zaXRpb24oT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25WYWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuICgoQW5ub3RhdGlvblZhbHVlKSB2YWx1ZSkuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuICgoTWV0aG9kRGVjbGFyYXRpb24pIHZhbHVlKS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJEZWNsYXJhdGlvbikgdmFsdWUpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGdldERvY3VtZW50QmFyZU9wZXJhdGlvblJlcXVlc3QoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGdldFdlYlBhcmFtTW9kZSh3ZWJQYXJhbSwgcGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChtb2RlLmVxdWFscyhNb2RlLklOLm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlcXVlc3Qod2ViUGFyYW0sIG1ldGhvZERlY2xhcmF0aW9uLCBwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlcXVlc3REZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVxdWVzdChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uLAotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24sIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBRTmFtZSBxTmFtZSA9IG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2UoYW5ub3RhdGlvbk1pcnJvciwgbWV0aG9kRGVjbGFyYXRpb24pLCBuYW1lLmdldFZhbHVlKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcU5hbWVzLnB1dChuYW1lLCBxTmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KHBhcmFtZXRlckRlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRPcGVyYXRpb25SZXF1ZXN0RGVmYXVsdChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShtZXRob2REZWNsYXJhdGlvbi5nZXREZWNsYXJpbmdUeXBlKCkpLCBtZXRob2REZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnZXREb2N1bWVudEJhcmVPcGVyYXRpb25SZXNwb25zZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgTWFwPE9iamVjdCwgUU5hbWU+IHFOYW1lcykgewotICAgICAgICBpZiAoIXJldHVybnNWb2lkKG1ldGhvZERlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyksCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZERlY2xhcmF0aW9uLCBxTmFtZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyA9IG1ldGhvZERlY2xhcmF0aW9uLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gOiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJQYXJhbSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlckRlY2xhcmF0aW9uLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1vZGUgPSBnZXRXZWJQYXJhbU1vZGUod2ViUGFyYW0sIHBhcmFtZXRlckRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUuZXF1YWxzKE1vZGUuT1VULm5hbWUoKSkgfHwgbW9kZS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpICYmICFpc0hlYWRlcih3ZWJQYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE9wZXJhdGlvblJlc3BvbnNlKHdlYlBhcmFtLCBtZXRob2REZWNsYXJhdGlvbiwgcU5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZXREZWZhdWx0V2ViUGFyYW1Nb2RlKHBhcmFtZXRlckRlY2xhcmF0aW9uKS5lcXVhbHMoTW9kZS5JTk9VVC5uYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQocGFyYW1ldGVyRGVjbGFyYXRpb24sIGdldE9wZXJhdGlvblJlc3BvbnNlRGVmYXVsdChtZXRob2REZWNsYXJhdGlvbikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2V0T3BlcmF0aW9uUmVzcG9uc2UoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwKLSAgICAgICAgICAgIE1hcDxPYmplY3QsIFFOYW1lPiBxTmFtZXMpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKGFubm90YXRpb25NaXJyb3IsIE5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHFOYW1lcy5wdXQobmFtZSwgbmV3IFFOYW1lKGdldFRhcmdldE5hbWVzcGFjZShhbm5vdGF0aW9uTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbiksIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcU5hbWVzLnB1dChtZXRob2REZWNsYXJhdGlvbiwgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBxTmFtZXMucHV0KG1ldGhvZERlY2xhcmF0aW9uLCBnZXRPcGVyYXRpb25SZXNwb25zZURlZmF1bHQobWV0aG9kRGVjbGFyYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUU5hbWUgZ2V0T3BlcmF0aW9uUmVzcG9uc2VEZWZhdWx0KE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUU5hbWUoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSksIG1ldGhvZERlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKQotICAgICAgICAgICAgICAgICsgUkVTUE9OU0VfU1VGRklYKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoQW5ub3RhdGlvbk1pcnJvciBhbm5vdGF0aW9uTWlycm9yKSB7Ci0gICAgICAgIEJvb2xlYW4gaGVhZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEJvb2xlYW5WYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBIRUFERVIpOwotICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYlBhcmFtTW9kZShBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IsIFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBtb2RlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb25NaXJyb3IsIE1PREUpOwotICAgICAgICBpZiAobW9kZSA9PSBudWxsIHx8IG1vZGUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbW9kZSA9IGdldERlZmF1bHRXZWJQYXJhbU1vZGUocGFyYW1ldGVyRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRXZWJQYXJhbU1vZGUoUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24pIHsKLSAgICAgICAgVHlwZU1pcnJvciB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpOwotICAgICAgICBpZiAodHlwZU1pcnJvci50b1N0cmluZygpLmVxdWFscyhIb2xkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIE1vZGUuSU5PVVQubmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNb2RlLklOLm5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gcmV0dXJuc1ZvaWQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uLmdldFJldHVyblR5cGUoKS5lcXVhbHMoZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0Vm9pZFR5cGUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kUGFyYW1ldGVycyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAvL05vdCBEb2MgQmFyZQotICAgICAgICAgICAgaWYgKCFoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhtZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBtZXRob2RzLmFkZChtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgTGlzdDxBbm5vdGF0aW9uVmFsdWU+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uVmFsdWU+KCk7Ci0gICAgICAgICAgICBMaXN0PFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gKExpc3Q8UGFyYW1ldGVyRGVjbGFyYXRpb24+KSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbSwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2gobmFtZSwgcGFyYW1ldGVyRGVjbGFyYXRpb24sIHBhcmFtZXRlcnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBuYW1lcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbmFtZXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG90aGVyTmFtZSA9IG5hbWVzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9TdHJpbmcoKS5lcXVhbHMob3RoZXJOYW1lLnRvU3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuUEFSQU1FVEVSX05BTUVfQ0xBU0gsIG5hbWUuZ2V0VmFsdWUoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG90aGVyTmFtZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5QQVJBTUVURVJfTkFNRV9DTEFTSCwgb3RoZXJOYW1lLmdldFZhbHVlKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RGb3JHZW5lcmF0ZWROYW1lQ2xhc2goQW5ub3RhdGlvblZhbHVlIHdlYlBhcmFtTmFtZSwgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyLAotICAgICAgICAgICAgTGlzdDxQYXJhbWV0ZXJEZWNsYXJhdGlvbj4gcGFyYW1ldGVycykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IHdlYlBhcmFtTmFtZS50b1N0cmluZygpOwotICAgICAgICBNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIobmFtZSk7Ci0gICAgICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkgewotICAgICAgICAgICAgaW50IGFyZ04gPSBJbnRlZ2VyLnBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDMpKTsKLSAgICAgICAgICAgIGlmIChhcmdOICE9IHBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbWV0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZ04gPCBwYXJhbWV0ZXJzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJOID0gcGFyYW1ldGVycy5nZXQoYXJnTik7Ci0gICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW1OID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyTiwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAod2ViUGFyYW1OICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WYWx1ZSB3ZWJQYXJhbU5hbWVOID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJQYXJhbU4sIE5BTUUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtTmFtZU4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IocGFyYW1ldGVyTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3ZWJQYXJhbU5hbWVOLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViUGFyYW1OYW1lTi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihwYXJhbWV0ZXJOLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkdFTkVSQVRFRF9QQVJBTUVURVJfTkFNRV9DTEFTSCwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJQYXJhbU5hbWUuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuR0VORVJBVEVEX1BBUkFNRVRFUl9OQU1FX0NMQVNILCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gZ2V0QXR0cmlidXRlVmFsdWUodHlwZURlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlLmNsYXNzLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZSh0eXBlRGVjbGFyYXRpb24uZ2V0UGFja2FnZSgpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3IgYW5ub3RhdGlvbk1pcnJvciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uTWlycm9yLCBUQVJHRVRfTkFNRVNQQUNFKTsKLSAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgPSBnZXRUYXJnZXROYW1lc3BhY2UobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShtZXRob2REZWNsYXJhdGlvbiwgV2ViTWV0aG9kLmNsYXNzLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25OYW1lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAoc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc29hcEJpbmRpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IChNZXRob2REZWNsYXJhdGlvbikgZGVjbGFyYXRpb247Ci0gICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGQ1ZjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kQ2hlY2tGb3JXZWJTZXJ2aWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkuZ2V0RGVjbGFyYXRpb24oKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKCgoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5nZXREZWNsYXJpbmdUeXBlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0ZvcldlYlNlcnZpY2VBbm5vdGF0aW9uKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcykgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RFeGNsdWRlUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2ZDM0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FWENMVURFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uVHlwZURlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJNZXRob2QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50LmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoCi0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZXhjbHVkZUF0dHJpYnV0ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUoYW5ub3RhdGlvbk1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENMVURFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2x1ZGVBdHRyaWJ1dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IG1ldGhvZERlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoQm9vbGVhbikgZXhjbHVkZUF0dHJpYnV0ZS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFubm90YXRpb25NaXJyb3IuZ2V0RWxlbWVudFZhbHVlcygpLnNpemUoKSA+IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGV4Y2x1ZGVBdHRyaWJ1dGUuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjAxMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKAotICAgICAgICAgICAgICAgIGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVjbGFyYXRpb24uZ2V0RGVjbGFyaW5nVHlwZSgpIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtZXRob2REZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfTk9fRklOQUxfTU9ESUZJRVJfQUxMT1dFRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY2YTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Db25zdHJ1Y3RvckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgLmdldERlY2xhcmF0aW9uc0Fubm90YXRlZFdpdGgoYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24gJiYgIShkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGhhc0RlZmF1bHRDb25zdHJ1Y3RvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiA9IChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnN0cnVjdG9yRGVjbGFyYXRpb24+IGNvbnN0cnVjdG9ycyA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0Q29uc3RydWN0b3JzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvckRlY2xhcmF0aW9uIDogY29uc3RydWN0b3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzRGVmYXVsdENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3RvcikgewotICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFubm90YXRpb25NaXJyb3JzID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk1pcnJvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIG1pcnJvciA6IGFubm90YXRpb25NaXJyb3JzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKGFubm90YXRpb25EZWNsYXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTUwN2Q0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZUVKQk1vZHVsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLmVudi5FY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRUpCTW9kdWxlUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVMRVNTID0gImphdmF4LmVqYi5TdGF0ZWxlc3MiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVCA9ICJqc3QuZWpiIjsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRkFDRVRfVkVSU0lPTiA9ICIzLjAiOyAvLyROT04tTkxTLTEkCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBpZiAoZW52aXJvbm1lbnQgaW5zdGFuY2VvZiBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSB7Ci0gICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLQotICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGVjbGlwc2VFbnZpcm9ubWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRmFjZXRlZFByb2plY3QocHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChFSkJfRkFDRVQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoRUpCX0ZBQ0VUX1ZFUlNJT04pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZWNsaXBzZUVudmlyb25tZW50LmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aCh3ZWJTZXJ2aWNlRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT05MWV9PTl9TVEFURUxFU1NfU0VTU0lPTl9CRUFOUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEFubm90YXRpb25NaXJyb3IgZ2V0U3RhdGVsZXNzQW5ub3RhdGlvbihEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPEFubm90YXRpb25NaXJyb3I+IGFhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgOiBhYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiA9IGFubm90YXRpb25NaXJyb3IuZ2V0QW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU1RBVEVMRVNTKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uTWlycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgU2V0PElGYWNldGVkUHJvamVjdD4gZmFjZXRlZFByb2plY3RzID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0RmFjZXRlZFByb2plY3RzKCk7Ci0gICAgICAgIGZvciAoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0IDogZmFjZXRlZFByb2plY3RzKSB7Ci0gICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRiZDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZU5vRmluYWxpemVNZXRob2RSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkZJTkFMSVpFOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gZmluYWxpemVNZXRob2QgPSBnZXRGaW5hbGl6ZU1ldGhvZChkZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICBpZiAoZmluYWxpemVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGZpbmFsaXplTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBnZXRGaW5hbGl6ZU1ldGhvZChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZERlY2xhcmF0aW9ucyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uLmdldFNpbXBsZU5hbWUoKS5lcXVhbHMoRklOQUxJWkUpIAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2REZWNsYXJhdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUGFyYW1ldGVyc1JldHVyblR5cGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJlYTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVBhcmFtZXRlcnNSZXR1cm5UeXBlc1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5QYXJhbWV0ZXJEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5BcnJheVR5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5DbGFzc1R5cGU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5JbnRlcmZhY2VUeXBlOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuVHlwZU1pcnJvcjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQYXJhbWV0ZXJzUmV0dXJuVHlwZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IEpBVkFfVFlQRVMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgc3RhdGljIHsKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5DYWxlbmRhciIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkFycmF5TGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuSGFzaFNldCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlua2VkTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuU3RhY2siKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdEZWNpbWFsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubWF0aC5CaWdJbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuVVVJRCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLm5ldC5VUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5hd3QuSW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YXgueG1sLmRhdGF0eXBlLkR1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Cb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlNob3J0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5Wb2lkIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5pby5TZXJpYWxpemFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLkNsb25lYWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuQ29tcGFyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEudXRpbC5NYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2hNYXAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS51dGlsLkhhc2h0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgSkFWQV9UWVBFUy5hZGQoImphdmEubGFuZy5FeGNlcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBKQVZBX1RZUEVTLmFkZCgiamF2YS5sYW5nLlRocm93YWJsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIEpBVkFfVFlQRVMuYWRkKCJqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmxhbmcuQ2xvbmVhYmxlIik7IC8vICROT04tTkxTJAotICAgICAgICBBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmFkZCgiamF2YS5sYW5nLkNvbXBhcmFibGUiKTsgLy8gJE5PTi1OTFMkCi0gICAgICAgIEFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuYWRkKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOyAvLyAkTk9OLU5MUyQKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1RFX09CSkVDVCA9ICJqYXZhLnJtaS5SZW1vdGUiOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiB3ZWJTZXJ2aWNlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKHdlYlNlcnZpY2VEZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKChJbnRlcmZhY2VEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTWV0aG9kUGFyYW1ldGVyc0FuZFJldHVyblR5cGVzKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gaW50ZXJmYWNlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kcykgewotICAgICAgICAgICAgVHlwZU1pcnJvciByZXR1cm5UeXBlID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgdmFsaWRhdGVUeXBlTWlycm9yKHJldHVyblR5cGUsIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSAgbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVR5cGVNaXJyb3IocGFyYW1ldGVyRGVjbGFyYXRpb24uZ2V0VHlwZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUeXBlTWlycm9yKFR5cGVNaXJyb3IgcmV0dXJuVHlwZSwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBBcnJheVR5cGUpIHsKLSAgICAgICAgICAgIEFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSByZXR1cm5UeXBlOwotCi0gICAgICAgICAgICBUeXBlTWlycm9yIGNvbXBvbmVudFR5cGUgPSBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGNvbXBvbmVudFR5cGU7Ci0gICAgICAgICAgICAgICAgY2hlY2tDbGFzc1Jlc3RyaWN0aW9uKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR1cm5UeXBlIGluc3RhbmNlb2YgSW50ZXJmYWNlVHlwZSkgewotICAgICAgICAgICAgSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlID0gKEludGVyZmFjZVR5cGUpIHJldHVyblR5cGU7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVBcmd1bWVudHMgPSBpbnRlcmZhY2VUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlcmZhY2UoKEludGVyZmFjZURlY2xhcmF0aW9uKSB0eXBlTWlycm9yLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0ludGVyZmFjZShpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCksIG1ldGhvZERlY2xhcmF0aW9uKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUgaW5zdGFuY2VvZiBDbGFzc1R5cGUpIHsKLSAgICAgICAgICAgIENsYXNzVHlwZSBjbGFzc1R5cGUgPSAoQ2xhc3NUeXBlKSByZXR1cm5UeXBlOwotICAgICAgICAgICAgQ29sbGVjdGlvbjxUeXBlTWlycm9yPiB0eXBlQXJndW1lbnRzID0gY2xhc3NUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVBcmd1bWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihjbGFzc1R5cGUuZ2V0RGVjbGFyYXRpb24oKSwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xhc3NSZXN0cmljdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGNoZWNrSW5uZXJQdWJsaWNTdGF0aWNUeXBlcyhjbGFzc0RlY2xhcmF0aW9uLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgIGNoZWNrSWZSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbiwgbWV0aG9kRGVjbGFyYXRpb24pOwotICAgICAgICBjaGVja0Fic3RhY3RUeXBlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKGNsYXNzRGVjbGFyYXRpb24sIG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbm5lclB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGhhc0lubmVyTm9uUHVibGljU3RhdGljVHlwZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSEFTX0lOQURNSVNTSUJMRV9JTk5FUl9UWVBFUywgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNJbm5lck5vblB1YmxpY1N0YXRpY1R5cGVzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNKYXZhVHlwZShjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCk7Ci0gICAgICAgIGZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoIXR5cGVEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpCi0gICAgICAgICAgICAgICAgICAgIHx8ICF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuU1RBVElDKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tJbnRlcmZhY2UoSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIGlmICghaXNTdWl0YWJsZUludGVyZmFjZShpbnRlcmZhY2VEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU5URVJGQUNFU19OT1RfU1VQUE9SVEVELCBpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1aXRhYmxlSW50ZXJmYWNlKEludGVyZmFjZURlY2xhcmF0aW9uIGludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBpc0phdmFUeXBlKGludGVyZmFjZURlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkgJiYgSkFWQV9UWVBFUy5jb250YWlucyhpbnRlcmZhY2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpCi0gICAgICAgIHx8IGlzWE1MVHlwZShpbnRlcmZhY2VEZWNsYXJhdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZShJbnRlcmZhY2VEZWNsYXJhdGlvbiBpbnRlcmZhY2VEZWNsYXJhdGlvbikgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oaW50ZXJmYWNlRGVjbGFyYXRpb24sIFhtbFR5cGUuY2xhc3MpICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSWZSZW1vdGVPYmplY3QoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaXNSZW1vdGVPYmplY3QoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSVNfUkVNT1RFX09CSkVDVCwgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZU9iamVjdChDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBzdXBlckludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotCi0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwgJiYgaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoUkVNT1RFX09CSkVDVCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrQWJzdGFjdFR5cGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoY2xhc3NEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5BQlNUUkFDVCkpIHsKLSAgICAgICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgICAgICBFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50IGVjbGlwc2VFbnZpcm9ubWVudCA9IChFY2xpcHNlQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50KSBlbnZpcm9ubWVudDsKLSAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBlY2xpcHNlRW52aXJvbm1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlW10gc3ViVHlwZXMgPSBoaWVyYXJjaHkuZ2V0QWxsU3VidHlwZXModHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJUeXBlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElUeXBlIHN1YlR5cGUgOiBzdWJUeXBlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmxhZ3MuaXNBYnN0cmFjdChzdWJUeXBlLmdldEZsYWdzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAgZW52aXJvbm1lbnQuZ2V0VHlwZURlY2xhcmF0aW9uKHN1YlR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBzdWJUeXBlRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlT2JqZWN0KHN1YlR5cGVEZWNsYXJhdGlvbikgfHwgaGFzSW5uZXJOb25QdWJsaWNTdGF0aWNUeXBlcyhzdWJUeXBlRGVjbGFyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoc3ViVHlwZURlY2xhcmF0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbXBsZW1lbnRzQ2xhc3NBbmRJbnRlcmZhY2Uoc3ViVHlwZURlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLkFCU1RSQUNUX0NMQVNTX05PVF9JTVBMRU1FTlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbXBsZW1lbnRzTXVsdGlwbGVJbnRlcmZhY2VzKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoaGFzU3VwZXJDbGFzcyhjbGFzc0RlY2xhcmF0aW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50QWxsb3dlZEludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSkgPiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBpZiAoIWhhc1N1cGVyQ2xhc3MoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKGNsYXNzRGVjbGFyYXRpb24uZ2V0U3VwZXJpbnRlcmZhY2VzKCkpID4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1N1cGVyQ2xhc3MoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIENsYXNzVHlwZSBzdXBlckNsYXNzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIGlmIChzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBzdXBlckNsYXNzLmdldERlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWUuZXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCkpIHx8IHF1YWxpZmllZE5hbWUuZXF1YWxzKEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tNdWx0aXBsZUluaGVyaXRhbmNlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgaWYgKGltcGxlbWVudHNNdWx0aXBsZUludGVyZmFjZXMoY2xhc3NEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IGdldEFsbG93ZWRJbnRlcmZhY2VOYW1lcyhjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpKTsKLSAgICAgICAgICAgIHByaW50RXJyb3IobWV0aG9kRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuSU1QTEVNRU5UU19NVUxUSVBMRV9JTlRFUkZBQ0VTLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0IFtdIHsgY2xhc3NEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCksIGludGVyZmFjZU5hbWVzLmdldCgwKSwgaW50ZXJmYWNlTmFtZXMuZ2V0KDEpIH0pKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW1wbGVtZW50c0NsYXNzQW5kSW50ZXJmYWNlKGNsYXNzRGVjbGFyYXRpb24pKSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMgPSBnZXRBbGxvd2VkSW50ZXJmYWNlTmFtZXMoY2xhc3NEZWNsYXJhdGlvbi5nZXRTdXBlcmludGVyZmFjZXMoKSk7Ci0gICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLklOSEVSSVRBTkNFX0FORF9JTVBMRU1FTlRBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtjbGFzc0RlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lcy5nZXQoMCl9ICkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0QWxsb3dlZEludGVyZmFjZU5hbWVzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKEludGVyZmFjZVR5cGUgaW50ZXJmYWNlVHlwZSA6IHN1cGVySW50ZXJmYWNlcykgewotICAgICAgICAgICAgaWYgKGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gc3VwZXJJbnRlcmZhY2UgPSBpbnRlcmZhY2VUeXBlLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBTExPV0VEX0lOX01VTFRJUExFX0lOSEVSSVRBTkNFLmNvbnRhaW5zKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlTmFtZXMuYWRkKHN1cGVySW50ZXJmYWNlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VOYW1lczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjb3VudEFsbG93ZWRJbnRlcmZhY2VzKENvbGxlY3Rpb248SW50ZXJmYWNlVHlwZT4gc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogc3VwZXJJbnRlcmZhY2VzKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlVHlwZS5nZXREZWNsYXJhdGlvbigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWNsYXJhdGlvbiBzdXBlckludGVyZmFjZSA9IGludGVyZmFjZVR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpZiAoIUFMTE9XRURfSU5fTVVMVElQTEVfSU5IRVJJVEFOQ0UuY29udGFpbnMoc3VwZXJJbnRlcmZhY2UuZ2V0UXVhbGlmaWVkTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0gICAgICAgIHJldHVybiB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZhLiIpICB8fCB0eXBlTmFtZS5zdGFydHNXaXRoKCJqYXZheC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTc1YTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVByb3ZpZGVyUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlZBTFVFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOw0KLWltcG9ydCBqYXZheC54bWwuc29hcC5TT0FQTWVzc2FnZTsNCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7DQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLlNlcnZpY2VNb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVByb3ZpZGVyOw0KLWltcG9ydCBqYXZheC54bWwud3MuU2VydmljZS5Nb2RlOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7DQotDQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNvbnN0cnVjdG9yRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTW9kaWZpZXI7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnR5cGUuSW50ZXJmYWNlVHlwZTsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IudHlwZS5UeXBlTWlycm9yOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHJvdmlkZXJSdWxlcyBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKCkgew0KLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOw0KLQ0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7DQotICAgICAgICAJaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgCQljaGVja0ZvckRlZmF1bHRDb25zdHJ1Y3RvcigoQ2xhc3NEZWNsYXJhdGlvbilkZWNsYXJhdGlvbik7DQotICAgICAgICAJCWNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoKENsYXNzRGVjbGFyYXRpb24pZGVjbGFyYXRpb24pOw0KLSAgICAgICAgCX0NCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yUHJvdmlkZXJJbnRlcmZhY2UoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBDb2xsZWN0aW9uPEludGVyZmFjZVR5cGU+IGludGVyZmFjZXMgPSBjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpOw0KLSAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IGZhbHNlOw0KLSAgICAgICAgaWYgKGludGVyZmFjZXMuc2l6ZSgpID4gMCkgew0KLSAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbnRlcmZhY2VUeXBlIDogaW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFR5cGVNaXJyb3I+IHR5cGVQYXJhbWV0ZXJzID0gaW50ZXJmYWNlVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlUGFyYW1ldGVycy5zaXplKCkgPiAwKSB7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFR5cGVNaXJyb3IgdHlwZU1pcnJvciA6IHR5cGVQYXJhbWV0ZXJzKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVNaXJyb3IgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsID0gKENsYXNzRGVjbGFyYXRpb24pIHR5cGVNaXJyb3I7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc0RlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTT0FQTWVzc2FnZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1NPQVBNZXNzYWdlUmVxdWlyZW1lbnRzKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbnRlcmZhY2VUeXBlPiBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBjbGFzc0RlY2wuZ2V0U3VwZXJpbnRlcmZhY2VzKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRlZEludGVyZmFjZSA6IGltcGxlbWVudGVkSW50ZXJmYWNlcykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IGltcGxlbWVudGVkSW50ZXJmYWNlLmdldERlY2xhcmF0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzVHlwZWRQcm92aWRlciA9IHRydWU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlRGVjbC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKERhdGFTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0RhdGFTb3VyY2VSZXF1aXJlbWVudHMoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlTWlycm9yIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlRGVjbGFyYXRpb24gaW50ZXJmYWNlRGVjbCA9IChJbnRlcmZhY2VEZWNsYXJhdGlvbikgdHlwZU1pcnJvcjsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhTb3VyY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50c1R5cGVkUHJvdmlkZXIgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZURlY2wuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhEYXRhU291cmNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhjbGFzc0RlY2xhcmF0aW9uKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNUeXBlZFByb3ZpZGVyID0gdHJ1ZTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFpbXBsZW1lbnRzVHlwZWRQcm92aWRlcikgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwNCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7DQotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHdlYlNlcnZpY2VQcm92aWRlci5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9JTVBMRU1FTlRfVFlQRURfUFJPVklERVJfSU5URVJGQUNFKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU09BUE1lc3NhZ2VSZXF1aXJlbWVudHMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBpZiAoIWlzU09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX1NPQVBNRVNTQUdFX1NPQVBCSU5ESU5HKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmICghaXNNZXNzYWdlTW9kZShjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfU09BUE1FU1NBR0VfTUVTU0FHRV9NT0RFKTsNCi0gICAgICAgIH0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRGF0YVNvdXJjZVJlcXVpcmVtZW50cyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIGlmICghaXNIVFRQQmluZGluZyhjbGFzc0RlY2xhcmF0aW9uKSkgew0KLSAgICAgICAgICAgIHByaW50RXJyb3IoY2xhc3NEZWNsYXJhdGlvbi5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUFJPVklERVJfREFUQVNPVVJDRV9IVFRQQklORElORyk7DQotICAgICAgICB9DQotDQotCSAgICBpZiAoIWlzTWVzc2FnZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikpIHsNCi0gICAgICAgICAgICBwcmludEVycm9yKGNsYXNzRGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRVBST1ZJREVSX0RBVEFTT1VSQ0VfTUVTU0FHRV9NT0RFKTsNCi0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQkNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU09BUEJpbmRpbmcoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICBTdHJpbmcgYmluZGluZ1R5cGUgPSBnZXRCaW5kaW5nVHlwZVZhbHVlKGNsYXNzRGVjbGFyYXRpb24pOw0KLSAgICAgICAgaWYgKGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpIA0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HKQ0KLSAgICAgICAgICAgICAgICB8fCBiaW5kaW5nVHlwZS5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDExSFRUUF9NVE9NX0JJTkRJTkcpDQotICAgICAgICAgICAgICAgIHx8IGJpbmRpbmdUeXBlLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIVFRQQmluZGluZyhDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIFN0cmluZyBiaW5kaW5nVHlwZSA9IGdldEJpbmRpbmdUeXBlVmFsdWUoY2xhc3NEZWNsYXJhdGlvbik7DQotICAgICAgICBpZiAoYmluZGluZ1R5cGUuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRCaW5kaW5nVHlwZVZhbHVlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBiaW5kaW5nVHlwZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGNsYXNzRGVjbGFyYXRpb24sIEJpbmRpbmdUeXBlLmNsYXNzKTsNCi0gICAgICAgIGlmIChiaW5kaW5nVHlwZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGJpbmRpbmdUeXBlLCBWQUxVRSk7DQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZU1vZGUoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICByZXR1cm4gZ2V0U2VydmljZU1vZGUoY2xhc3NEZWNsYXJhdGlvbikuZXF1YWxzKE1vZGUuTUVTU0FHRS5uYW1lKCkpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BheWxvYWRNb2RlKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLSAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VNb2RlKGNsYXNzRGVjbGFyYXRpb24pLmVxdWFscyhNb2RlLlBBWUxPQUQubmFtZSgpKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2aWNlTW9kZShDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsNCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc2VydmljZU1vZGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTZXJ2aWNlTW9kZS5jbGFzcyk7DQotICAgICAgICBpZiAoc2VydmljZU1vZGUgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShzZXJ2aWNlTW9kZSwgVkFMVUUpOw0KLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gTW9kZS5QQVlMT0FELnRvU3RyaW5nKCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRGVmYXVsdENvbnN0cnVjdG9yKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgew0KLQkJYm9vbGVhbiBoYXNEZWZhdWx0Q29uc3RydWN0b3IgPSBmYWxzZTsNCi0JCUNvbGxlY3Rpb248Q29uc3RydWN0b3JEZWNsYXJhdGlvbj4gY29uc3RydWN0b3JzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRDb25zdHJ1Y3RvcnMoKTsNCi0JCWlmIChjb25zdHJ1Y3RvcnMuc2l6ZSgpID09IDApIHsNCi0JCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJfSBlbHNlIHsNCi0JCQlmb3IgKENvbnN0cnVjdG9yRGVjbGFyYXRpb24gY29uc3RydWN0b3JEZWNsYXJhdGlvbiA6IGNvbnN0cnVjdG9ycykgew0KLQkJCQlpZiAoY29uc3RydWN0b3JEZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKS5jb250YWlucyhNb2RpZmllci5QVUJMSUMpICYmIA0KLQkJCQkJCWNvbnN0cnVjdG9yRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpLnNpemUoKSA9PSAwKSB7DQotCQkJCQloYXNEZWZhdWx0Q29uc3RydWN0b3IgPSB0cnVlOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlpZiAoIWhhc0RlZmF1bHRDb25zdHJ1Y3Rvcikgew0KLQkJCUFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVByb3ZpZGVyID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZVByb3ZpZGVyLmNsYXNzKTsNCi0JCQlwcmludEZpeGFibGVFcnJvcih3ZWJTZXJ2aWNlUHJvdmlkZXIuZ2V0UG9zaXRpb24oKSwNCi0JCQkgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VQUk9WSURFUl9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUik7IA0KLQkJfSAgICAgICAgICAgICAgICANCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZTM4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5JbnRlcmZhY2VEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Nb2RpZmllcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3IgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQKLSAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEVudW1EZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGRlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfQ0xBU1NfT1JfSU5URVJGQUNFX09OTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3REZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbkRlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdERlY2xhcmF0aW9uKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbikgewotICAgICAgICBDb2xsZWN0aW9uPE1vZGlmaWVyPiBtb2RpZmllcnMgPSBkZWNsYXJhdGlvbi5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgaWYgKG1vZGlmaWVycy5jb250YWlucyhNb2RpZmllci5GSU5BTCkgfHwgbW9kaWZpZXJzLmNvbnRhaW5zKE1vZGlmaWVyLkFCU1RSQUNUKQotICAgICAgICAgICAgICAgIHx8ICFtb2RpZmllcnMuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZGVjbGFyYXRpb24uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWRlY2xhcmF0aW9uOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldE5lc3RlZFR5cGVzKCkuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgdGVzdE5lc3RlZFR5cGVzKHR5cGVEZWNsYXJhdGlvbi5nZXROZXN0ZWRUeXBlcygpLCBhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3ROZXN0ZWRUeXBlcyhDb2xsZWN0aW9uPFR5cGVEZWNsYXJhdGlvbj4gbmVzdGVkVHlwZXMsQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBhbm5vdGF0aW9uRGVjbGFyYXRpb24pIHsKLSAgICAgICAgZm9yIChUeXBlRGVjbGFyYXRpb24gbmVzdGVkRGVjbGFyYXRpb24gOiBuZXN0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IG5lc3RlZERlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgICAgICBmb3IgKEFubm90YXRpb25NaXJyb3IgbWlycm9yIDogYW5ub3RhdGlvbk1pcnJvcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yLmdldEFubm90YXRpb25UeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoYW5ub3RhdGlvbkRlY2xhcmF0aW9uLmdldFF1YWxpZmllZE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BVQkxJQ19BQlNUUkFDVF9GSU5BTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlUmVmc1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3ZjVlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VSZWZzUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuYW5ub3RhdGlvbnMudmFsaWRhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVFlQRTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWZzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOw0KLQ0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkNsYXNzRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlUmVmc1J1bGVzIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7DQotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gPSAoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgZW52aXJvbm1lbnQNCi0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlUmVmcy5jbGFzcy5nZXROYW1lKCkpOw0KLQ0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudA0KLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKTsNCi0NCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgew0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZVJlZnMgPSBBbm5vdGF0aW9uVXRpbHMNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBXZWJTZXJ2aWNlUmVmcy5jbGFzcyk7DQotDQotICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHdlYlNlcnZpY2VSZWZzVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKHdlYlNlcnZpY2VSZWZzLCBWQUxVRSk7DQotDQotICAgICAgICAgICAgaWYgKHdlYlNlcnZpY2VSZWZzVmFsdWUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmc1ZhbHVlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMaXN0PD8+KSB7DQotICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvblZhbHVlPiB2YWx1ZSA9IChMaXN0PEFubm90YXRpb25WYWx1ZT4pIHdlYlNlcnZpY2VSZWZzVmFsdWUuZ2V0VmFsdWUoKTsNCi0NCi0gICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uVmFsdWUgYW5ub3RhdGlvblZhbHVlIDogdmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVmFsdWUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEFubm90YXRpb25NaXJyb3IpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2VSZWYgPSAoQW5ub3RhdGlvbk1pcnJvcikgYW5ub3RhdGlvblZhbHVlLmdldFZhbHVlKCk7DQotDQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdlYlNlcnZpY2VSZWZOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2VSZWYsIE5BTUUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZSA9PSBudWxsIHx8IHdlYlNlcnZpY2VSZWZOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX05BTUVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgd2ViU2VydmljZVJlZk5hbWVUeXBlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYlNlcnZpY2VSZWYsIFRZUEUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgIT0gbnVsbCAmJiB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGUgaW5zdGFuY2VvZiBBbm5vdGF0aW9uVmFsdWUpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHR5cGUgPSAoQW5ub3RhdGlvblZhbHVlKSB3ZWJTZXJ2aWNlUmVmTmFtZVR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24gPSAoQ2xhc3NEZWNsYXJhdGlvbikgdHlwZS5nZXRWYWx1ZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzRGVjbGFyYXRpb24uZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlUmVmLmdldFBvc2l0aW9uKCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFUkVGU19UWVBFX1JFUVVJUkVEKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Iod2ViU2VydmljZVJlZi5nZXRQb3NpdGlvbigpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VSRUZTX1RZUEVfUkVRVUlSRUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlBbGxvd2VkQXR0cmlidXRlc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzI1MGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSUFsbG93ZWRBdHRyaWJ1dGVzUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uRGVjbGFyYXRpb247Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uSW50ZXJmYWNlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJQWxsb3dlZEF0dHJpYnV0ZXNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgLmdldFR5cGVEZWNsYXJhdGlvbihXZWJTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxEZWNsYXJhdGlvbj4gYW5ub3RhdGVkVHlwZXMgPSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIAotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsKLSAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgc2VydmljZU5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgU0VSVklDRV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKHNlcnZpY2VOYW1lLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgRU5EUE9JTlRfSU5URVJGQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKGVuZHBvaW50SW50ZXJmYWNlLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIHBvcnROYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZShtaXJyb3IsIFBPUlRfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0TmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihwb3J0TmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1BPUlROQU1FX1NFSSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVNFSVJlc3RyaWN0aW9uc1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiYTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5FTkRQT0lOVF9JTlRFUkZBQ0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnByb2Nlc3Nvci5BYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25WYWx1ZTsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkludGVyZmFjZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1vZGlmaWVyOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhcmFtZXRlckRlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlSZXN0cmljdGlvbnNSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoKSB7Ci0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50Ci0gICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIENvbGxlY3Rpb248QW5ub3RhdGlvbk1pcnJvcj4gYW5ub3RhdGlvbk1pcnJvcnMgPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTWlycm9ycygpOwotICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgZW5kcG9pbnRJbnRlcmZhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVF9JTlRFUkZBQ0UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRJbnRlcmZhY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblZhbHVlIG5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvblZhbHVlKG1pcnJvciwgTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IobmFtZS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUmVzdHJpY3Rpb25zKChDbGFzc0RlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbiwgZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tKU1IxODFBbm5vdGF0aW9ucygoQ2xhc3NEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzdHJpY3Rpb25zKENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbiwgQW5ub3RhdGlvblZhbHVlIGVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgIFN0cmluZyBzZWkgPSBlbmRwb2ludEludGVyZmFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmIChKRFRVdGlscy52YWxpZGF0ZUphdmFUeXBlTmFtZShzZWkpLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oc2VpKTsKLSAgICAgICAgaWYgKHR5cGVEZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoISh0eXBlRGVjbGFyYXRpb24gaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgfHwgdHlwZURlY2xhcmF0aW9uIGluc3RhbmNlb2YgQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbikgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfSU5URVJGQUNFLCBzZWkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldERlY2xhcmluZ1R5cGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PVF9PVVRFUiwgc2VpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIGFubm90YXRpb25NaXJyb3IgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25NaXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfQU5OT1RBVEVELCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCF0eXBlRGVjbGFyYXRpb24uZ2V0TW9kaWZpZXJzKCkuY29udGFpbnMoTW9kaWZpZXIuUFVCTElDKSkgewotICAgICAgICAgICAgICAgIHByaW50RXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT1RfUFVCTElDLCBzZWkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjbGFzc0RlY2xhcmF0aW9uLmdldFN1cGVyaW50ZXJmYWNlcygpLmNvbnRhaW5zKHR5cGVEZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2REZWNsYXJhdGlvbj4gc2VpTWV0aG9kcyA9IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCA6IHNlaU1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbXBsZW1lbnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5jb21wYXJlTWV0aG9kcyhzZWlNZXRob2QsIGltcGxNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsTWV0aG9kLmdldE1vZGlmaWVycygpLmNvbnRhaW5zKE1vZGlmaWVyLlBVQkxJQykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoaW1wbE1ldGhvZC5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9SRURVQ0VEX1ZJU0lCSUxJVFkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxNZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVxdWFscyhzZWlNZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihpbXBsTWV0aG9kLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX0lOQ09NUEFUSUJMRV9SRVRVUk5fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX1JFVFVSTl9UWVBFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxNZXRob2QuZ2V0VGhyb3duVHlwZXMoKS5zaXplKCkgIT0gc2VpTWV0aG9kLmdldFRocm93blR5cGVzKCkuc2l6ZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW1wbE1ldGhvZC5nZXRUaHJvd25UeXBlcygpLmNvbnRhaW5zQWxsKHNlaU1ldGhvZC5nZXRUaHJvd25UeXBlcygpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKGltcGxNZXRob2QuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfSU5DT01QQVRJQkxFX0VYQ0VQVElPTlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbE1ldGhvZC5nZXRTaW1wbGVOYW1lKCksIHNlaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpbXBsZW1lbnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3IoZW5kcG9pbnRJbnRlcmZhY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbXBsZW1lbnRzTWVzc2FnZSh0eXBlRGVjbGFyYXRpb24sIHNlaU1ldGhvZCkpLCAiIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTVVTVF9JTVBMRU1FTlQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRFcnJvcihlbmRwb2ludEludGVyZmFjZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9UX0ZPVU5ELCBzZWkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudHNNZXNzYWdlKFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uIHNlaU1ldGhvZCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtZXNzYWdlLmFwcGVuZChzZWlNZXRob2QuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gc2VpTWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSXRlcmF0b3I8UGFyYW1ldGVyRGVjbGFyYXRpb24+IGl0ZXIgPSBwYXJhbWV0ZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUGFyYW1ldGVyRGVjbGFyYXRpb24gcGFyYW1ldGVyRGVjbGFyYXRpb24gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0eXBlTWlycm9yID0gZW52aXJvbm1lbnQuZ2V0VHlwZVV0aWxzKCkuZ2V0RXJhc3VyZShwYXJhbWV0ZXJEZWNsYXJhdGlvbi5nZXRUeXBlKCkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCh0eXBlTWlycm9yLnN1YnN0cmluZyh0eXBlTWlycm9yLmxhc3RJbmRleE9mKCIuIikgKyAxKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrSlNSMTgxQW5ub3RhdGlvbnMoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmcgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihjbGFzc0RlY2xhcmF0aW9uLCBTT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihzb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb24+IGltcGxNZXRob2RzID0gY2xhc3NEZWNsYXJhdGlvbgotICAgICAgICAuZ2V0TWV0aG9kcygpOwotICAgICAgICBmb3IgKGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLk1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogaW1wbE1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3IgbXNvYXBCaW5kaW5nID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChtc29hcEJpbmRpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG1zb2FwQmluZGluZy5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1NPQVBCSU5ESU5HKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChvbmV3YXkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByaW50Rml4YWJsZUVycm9yKG9uZXdheS5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX09ORVdBWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJNZXRob2QuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJNRVRIT0RTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUmVzdWx0ID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYlJlc3VsdC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcih3ZWJSZXN1bHQuZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJSRVNVTFQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlckRlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gbWV0aG9kRGVjbGFyYXRpb24uZ2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXJEZWNsYXJhdGlvbiBwYXJhbWV0ZXJEZWNsYXJhdGlvbiA6IHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24ocGFyYW1ldGVyRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHdlYlBhcmFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRGaXhhYmxlRXJyb3Iod2ViUGFyYW0uZ2V0UG9zaXRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL2Fubm90YXRpb25zL3ZhbGlkYXRpb24vV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxNTRlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VUYXJnZXROYW1lc3BhY2VSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlRBUkdFVF9OQU1FU1BBQ0U7DQotDQotaW1wb3J0IGphdmEubmV0LlVSSTsNCi1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsNCi0NCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblZhbHVlOw0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlBhY2thZ2VEZWNsYXJhdGlvbjsNCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uUGFyYW1ldGVyRGVjbGFyYXRpb247DQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsNCi0NCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVRhcmdldE5hbWVzcGFjZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25Qcm9jZXNzb3Igew0KLQ0KLSAgICBAT3ZlcnJpZGUNCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsNCi0gICAgICAgIEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gYW5ub3RhdGlvbkRlY2xhcmF0aW9uID0gKEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24pIGVudmlyb25tZW50DQotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsNCi0NCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQNCi0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7DQotDQotICAgICAgICBmb3IgKERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogYW5ub3RhdGVkVHlwZXMpIHsNCi0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsNCi0gICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24sIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmFsdWUgdGFyZ2V0TmFtZXNwYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25WYWx1ZSh3ZWJTZXJ2aWNlLCBUQVJHRVRfTkFNRVNQQUNFKTsNCi0NCi0gICAgICAgICAgICAgICAgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOw0KLSAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uLmdldFBhY2thZ2UoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VEZWNsYXJhdGlvbi5nZXRRdWFsaWZpZWROYW1lKCkubGVuZ3RoKCkgPT0gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSA9PSBudWxsIHx8IHRhcmdldE5hbWVzcGFjZS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BBQ0tBR0VfVEFSR0VUX05BTUVTUEFDRSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICAgICAgdmFsaWRhdGVVUklTeW50YXgodGFyZ2V0TmFtZXNwYWNlKTsNCi0NCi0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZHMgPSAoKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLmdldE1ldGhvZHMoKTsNCi0gICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsNCi0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248UGFyYW1ldGVyRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBtZXRob2REZWNsYXJhdGlvbi5nZXRQYXJhbWV0ZXJzKCk7DQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlckRlY2xhcmF0aW9uIHBhcmFtZXRlckRlY2xhcmF0aW9uIDogcGFyYW1ldGVycykgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXJEZWNsYXJhdGlvbiwgV2ViUGFyYW0uY2xhc3MpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJQYXJhbSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViUGFyYW0sIFRBUkdFVF9OQU1FU1BBQ0UpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgIH0NCi0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVVJJU3ludGF4KEFubm90YXRpb25WYWx1ZSB0YXJnZXROYW1lc3BhY2UpIHsNCi0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIG5ldyBVUkkodGFyZ2V0TmFtZXNwYWNlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7DQotICAgICAgICAgICAgICAgIHByaW50RXJyb3IodGFyZ2V0TmFtZXNwYWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoDQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuVEFSR0VUX05BTUVTUEFDRV9VUklfU1lOVEFYX0VSUk9SLCBuZXcgT2JqZWN0W10gew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpc2UuZ2V0SW5kZXgoKSwgdXJpc2UuZ2V0SW5wdXQoKSwgdXJpc2UuZ2V0UmVhc29uKCkgfSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXU0RMTG9jYXRpb25SdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTMzYTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuRU5EUE9JTlRfSU5URVJGQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVYQ0xVREU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUE9SVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfU1VGRklYOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlNFUlZJQ0VfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TVFlMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLldTRExfTE9DQVRJT047Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LndzZGwuQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5PcGVyYXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcDEyLlNPQVAxMkJpbmRpbmc7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5lbnYuRWNsaXBzZUFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUucHJvY2Vzc29yLkFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLldTRExVdGlsczsKLQotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkFubm90YXRpb25NaXJyb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVmFsdWU7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQ2xhc3NEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5EZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5UeXBlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV1NETExvY2F0aW9uUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblByb2Nlc3NvciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAuZ2V0VHlwZURlY2xhcmF0aW9uKFdlYlNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAgICAgICBDb2xsZWN0aW9uPERlY2xhcmF0aW9uPiBhbm5vdGF0ZWRUeXBlcyA9IGVudmlyb25tZW50Ci0gICAgICAgIC5nZXREZWNsYXJhdGlvbnNBbm5vdGF0ZWRXaXRoKGFubm90YXRpb25EZWNsYXJhdGlvbik7Ci0KLSAgICAgICAgZm9yIChEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA6IGFubm90YXRlZFR5cGVzKSB7Ci0gICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBDbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uID0gKENsYXNzRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgIGNoZWNrV1NETG9jYXRpb24oY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXU0RMb2NhdGlvbihDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY2xhc3NEZWNsYXJhdGlvbiwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uVmFsdWUod2ViU2VydmljZSwgV1NETF9MT0NBVElPTik7Ci0gICAgICAgIGlmICh3c2RsTG9jYXRpb25WYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgd3NkbExvY2F0aW9uID0gd3NkbExvY2F0aW9uVmFsdWUuZ2V0VmFsdWUoKS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmICh3c2RsTG9jYXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHdzZGxMb2NhdGlvbi5lbmRzV2l0aCgiLndzZGwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIFVSTCByZWxhdGl2ZVVSTCA9IGdldFJlbGF0aXZlVVJMKGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGl2ZVVSTCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVdTREwocmVsYXRpdmVVUkwudG9TdHJpbmcoKSwgd2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiwgd3NkbExvY2F0aW9uVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlV1NETCh3c2RsTG9jYXRpb24sIHdlYlNlcnZpY2UsIGNsYXNzRGVjbGFyYXRpb24sIHdzZGxMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3c2RsTG9jYXRpb25WYWx1ZS5nZXRQb3NpdGlvbigpLCBKQVhXU0NvcmVNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuRU1QVFlfQVRUUklCVVRFX1ZBTFVFLCBuZXcgT2JqZWN0W10ge1dlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU0RMX0xPQ0FUSU9OfSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVUkwgZ2V0UmVsYXRpdmVVUkwoQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uLCBTdHJpbmcgd3NkbExvY2F0aW9uKSB7Ci0gICAgICAgIGlmIChlbnZpcm9ubWVudCBpbnN0YW5jZW9mIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIHsKLSAgICAgICAgICAgIEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZWNsaXBzZUVudmlyb25tZW50ID0gKEVjbGlwc2VBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQpIGVudmlyb25tZW50OwotICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZWNsaXBzZUVudmlyb25tZW50LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICBJRm9sZGVyIHdlYkNvbnRlbnRGb2xkZXIgPSBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudEZvbGRlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKHdlYkNvbnRlbnRGb2xkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElSZXNvdXJjZSB3c2RsUmVzb3VyY2UgPSB3ZWJDb250ZW50Rm9sZGVyLmZpbmRNZW1iZXIod3NkbExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAod3NkbFJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3c2RsUmVzb3VyY2UuZ2V0TG9jYXRpb25VUkkoKS50b1VSTCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVybGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2cobXVybGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVdTREwoU3RyaW5nIHdzZGxMb2NhdGlvbiwgQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sIEFubm90YXRpb25WYWx1ZSB3c2RsTG9jYXRpb25WYWx1ZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVVJMIHdzZGxVUkwgPSBuZXcgVVJMKHdzZGxMb2NhdGlvbik7Ci0gICAgICAgICAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBXU0RMVXRpbHMucmVhZFdTREwod3NkbFVSTCk7Ci0gICAgICAgICAgICBpZiAoZGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUU5hbWUgc2VydmljZVFOYW1lID0gIGdldFNlcnZpY2VRTmFtZSh3ZWJTZXJ2aWNlLCBjbGFzc0RlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICBTZXJ2aWNlIHNlcnZpY2UgPSBnZXRTZXJ2aWNlKGRlZmluaXRpb24sIHNlcnZpY2VRTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSAgZ2V0UG9ydE5hbWUod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIFBvcnQgcG9ydCA9IGdldFBvcnQoc2VydmljZSwgcG9ydE5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBwb3J0LmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQmluZGluZyhiaW5kaW5nLCBjbGFzc0RlY2xhcmF0aW9uLCB3ZWJTZXJ2aWNlLCB3c2RsTG9jYXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IGdldFdlYk1ldGhvZHMoY2xhc3NEZWNsYXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T3BlcmF0aW9uPiBvcGVyYXRpb25zID0gYmluZGluZy5nZXRQb3J0VHlwZSgpLmdldE9wZXJhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IG1ldGhvZE1hcC5nZXQob3BlcmF0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZERlY2xhcmF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX09QRVJUQVRJT05fTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk1pcnJvciBvbmV3YXkgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbiwgT25ld2F5LmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZXdheSAhPSBudWxsICYmIG9wZXJhdGlvbi5nZXRPdXRwdXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKG1ldGhvZERlY2xhcmF0aW9uLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9XU0RMX09QRVJBVElPTl9PVVRQVVRfTUVUSE9EX09ORVdBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHttZXRob2REZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCksIG9wZXJhdGlvbi5nZXROYW1lKCl9KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludEVycm9yKHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMuYmluZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1BPUlRfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtwb3J0TmFtZSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcih3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX05PX1NFUlZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge3NlcnZpY2VRTmFtZS5nZXRMb2NhbFBhcnQoKSwgd3NkbExvY2F0aW9ufSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBwcmludEVycm9yKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIG11cmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgcHJpbnRXYXJuaW5nKHdzZGxMb2NhdGlvblZhbHVlLmdldFBvc2l0aW9uKCksIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfV1NETF9MT0NBVElPTl9VTkFCTEVfVE9fTE9DQVRFLCB3c2RsTG9jYXRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUJpbmRpbmcoQmluZGluZyBiaW5kaW5nLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24sCi0gICAgICAgICAgICBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIFN0cmluZyB3c2RsTG9jYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGUuRE9DVU1FTlQubmFtZSgpOwotCi0gICAgICAgIEFubm90YXRpb25NaXJyb3Igc29hcEJpbmRpbmdBbm5vdGF0aW9uID0gZ2V0U09BUEJpbmRpbmcoY2xhc3NEZWNsYXJhdGlvbiwgd2ViU2VydmljZSk7Ci0gICAgICAgIGlmIChzb2FwQmluZGluZ0Fubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlVmFsdWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoc29hcEJpbmRpbmdBbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZVZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBleHRlbnNpYmlsaXR5RWxlbWVudHMgPSAgYmluZGluZy5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudEV4dGVuc2libGUgOiBleHRlbnNpYmlsaXR5RWxlbWVudHMpIHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVBCaW5kaW5nKSB7Ci0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcgc29hcEJpbmRpbmcgPSAoU09BUEJpbmRpbmcpIGVsZW1lbnRFeHRlbnNpYmxlOwotICAgICAgICAgICAgICAgIGlmIChzdHlsZS5jb21wYXJlVG9JZ25vcmVDYXNlKHNvYXBCaW5kaW5nLmdldFN0eWxlKCkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRFcnJvcihzb2FwQmluZGluZ0Fubm90YXRpb24gPT0gbnVsbCA/IHdlYlNlcnZpY2UuZ2V0UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc29hcEJpbmRpbmdBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlTWVzc2FnZXMuYmluZChKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1dTRExfTE9DQVRJT05fU09BUF9CSU5ESU5HX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHt3c2RsTG9jYXRpb24sIHNvYXBCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50RXh0ZW5zaWJsZSBpbnN0YW5jZW9mIFNPQVAxMkJpbmRpbmcpIHsKLSAgICAgICAgICAgICAgICBTT0FQMTJCaW5kaW5nIHNvYXAxMkJpbmRpbmcgPSAoU09BUDEyQmluZGluZykgZWxlbWVudEV4dGVuc2libGU7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmNvbXBhcmVUb0lnbm9yZUNhc2Uoc29hcDEyQmluZGluZy5nZXRTdHlsZSgpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50RXJyb3Ioc29hcEJpbmRpbmdBbm5vdGF0aW9uID09IG51bGwgPyB3ZWJTZXJ2aWNlLmdldFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNvYXBCaW5kaW5nQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTQ29yZU1lc3NhZ2VzLmJpbmQoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XU0RMX0xPQ0FUSU9OX1NPQVBfQklORElOR19TVFlMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7d3NkbExvY2F0aW9uLCBzb2FwMTJCaW5kaW5nLmdldFN0eWxlKCksIHN0eWxlfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbk1pcnJvciBnZXRTT0FQQmluZGluZyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZURlY2xhcmF0aW9uLCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNZXRob2REZWNsYXJhdGlvbj4gZ2V0V2ViTWV0aG9kcyhUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+IG1ldGhvZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kRGVjbGFyYXRpb24+KCk7Ci0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIEVORFBPSU5UX0lOVEVSRkFDRSk7Ci0gICAgICAgIGlmIChlbmRwb2ludEludGVyZmFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gc2VpRGVjbGFyYXRpb24gPSBlbnZpcm9ubWVudC5nZXRUeXBlRGVjbGFyYXRpb24oZW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgaWYgKHNlaURlY2xhcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlRGVjbGFyYXRpb24gPSBzZWlEZWNsYXJhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2RzID0gdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLSAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kRGVjbGFyYXRpb24sIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgICAgICBpZiAod2ViTWV0aG9kICE9IG51bGwgJiYgIWlzRXhsdWRlZCh3ZWJNZXRob2QpKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kTWFwLnB1dChnZXRPcGVyYXRpb25OYW1lKHdlYk1ldGhvZCwgbWV0aG9kRGVjbGFyYXRpb24pLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1ldGhvZE1hcC5wdXQobWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpLCBtZXRob2REZWNsYXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGx1ZGVkKEFubm90YXRpb25NaXJyb3Igd2ViTWV0aG9kKSB7Ci0gICAgICAgIEJvb2xlYW4gZXhjbHVkZSA9IEFubm90YXRpb25VdGlscy5nZXRCb29sZWFuVmFsdWUod2ViTWV0aG9kLCBFWENMVURFKTsKLSAgICAgICAgaWYgKGV4Y2x1ZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGUuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJNZXRob2QsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYk1ldGhvZCwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uTmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgU2VydmljZSBnZXRTZXJ2aWNlKERlZmluaXRpb24gZGVmaW5pdGlvbiwgUU5hbWUgc2VydmljZVFOYW1lKSB7Ci0gICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgU2V0PE1hcC5FbnRyeT4gc2VydmljZXNTZXQgPSBzZXJ2aWNlc01hcC5lbnRyeVNldCgpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxRTmFtZSwgU2VydmljZT4gc2VydmljZUVudHJ5IDogc2VydmljZXNTZXQpIHsKLSAgICAgICAgICAgIFFOYW1lIHNlcnZpY2VFbnRyeUtleSA9IHNlcnZpY2VFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmIChzZXJ2aWNlRW50cnlLZXkuZXF1YWxzKHNlcnZpY2VRTmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZUVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBQb3J0IGdldFBvcnQoU2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgcG9ydE5hbWUpIHsKLSAgICAgICAgTWFwIHBvcnRzTWFwID0gc2VydmljZS5nZXRQb3J0cygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUG9ydD4gcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgIFN0cmluZyBwb3J0RW50cnlLZXkgPSBwb3J0RW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBpZiAocG9ydEVudHJ5S2V5LmVxdWFscyhwb3J0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9ydEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBRTmFtZSBnZXRTZXJ2aWNlUU5hbWUoQW5ub3RhdGlvbk1pcnJvciB3ZWJTZXJ2aWNlLCBDbGFzc0RlY2xhcmF0aW9uIGNsYXNzRGVjbGFyYXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKHdlYlNlcnZpY2UsIFNFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IGNsYXNzRGVjbGFyYXRpb24uZ2V0U2ltcGxlTmFtZSgpICsgU0VSVklDRV9TVUZGSVg7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBRTmFtZShnZXRUYXJnZXROYW1lc3BhY2Uod2ViU2VydmljZSwgY2xhc3NEZWNsYXJhdGlvbiksIHNlcnZpY2VOYW1lKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQb3J0TmFtZShBbm5vdGF0aW9uTWlycm9yIHdlYlNlcnZpY2UsIENsYXNzRGVjbGFyYXRpb24gY2xhc3NEZWNsYXJhdGlvbikgewotICAgICAgICBTdHJpbmcgcG9ydE5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgUE9SVF9OQU1FKTsKLSAgICAgICAgaWYgKHBvcnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHBvcnROYW1lID0gY2xhc3NEZWNsYXJhdGlvbi5nZXRTaW1wbGVOYW1lKCkgKyBQT1JUX1NVRkZJWDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9ydE5hbWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKEFubm90YXRpb25NaXJyb3Igd2ViU2VydmljZSwgQ2xhc3NEZWNsYXJhdGlvbiBjbGFzc0RlY2xhcmF0aW9uKSB7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUod2ViU2VydmljZSwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgIGlmICh0YXJnZXROYW1lc3BhY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlID0gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKAotICAgICAgICAgICAgICAgICAgICBjbGFzc0RlY2xhcmF0aW9uLmdldFBhY2thZ2UoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvYW5ub3RhdGlvbnMvdmFsaWRhdGlvbi9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhYTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS9hbm5vdGF0aW9ucy92YWxpZGF0aW9uL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLmFubm90YXRpb25zLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5wcm9jZXNzb3IuQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1pbXBvcnQgY29tLnN1bi5taXJyb3IuZGVjbGFyYXRpb24uQW5ub3RhdGlvbk1pcnJvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLkRlY2xhcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlIGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKCkgewotICAgICAgICBBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIGFubm90YXRpb25EZWNsYXJhdGlvbiA9IChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uKSBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRUeXBlRGVjbGFyYXRpb24oV2ViU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgICAgIENvbGxlY3Rpb248RGVjbGFyYXRpb24+IGFubm90YXRlZFR5cGVzID0gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyYXRpb25zQW5ub3RhdGVkV2l0aChhbm5vdGF0aW9uRGVjbGFyYXRpb24pOwotCi0gICAgICAgIGZvciAoRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gOiBhbm5vdGF0ZWRUeXBlcykgewotICAgICAgICAgICAgQ29sbGVjdGlvbjxBbm5vdGF0aW9uTWlycm9yPiBhbm5vdGF0aW9uTWlycm9ycyA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25NaXJyb3JzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IgOiBhbm5vdGF0aW9uTWlycm9ycykgewotICAgICAgICAgICAgICAgIGNoZWNrV2ViU2VydmljZVByb3ZpZGVyKG1pcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tXZWJTZXJ2aWNlUHJvdmlkZXIoQW5ub3RhdGlvbk1pcnJvciBtaXJyb3IpIHsKLSAgICAgICAgaWYgKG1pcnJvci5nZXRBbm5vdGF0aW9uVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBwcmludEZpeGFibGVFcnJvcihtaXJyb3IuZ2V0UG9zaXRpb24oKSwgSkFYV1NDb3JlTWVzc2FnZXMKLSAgICAgICAgICAgICAgICAgICAgLldFQlNFUlZJQ0VfV0VCU0VSVklDRVBST1ZJREVSX0NPTUJJTkFUSU9OKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU0hhbmRsZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE1NzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy9jb3JlL3V0aWxzL0pBWFdTSGFuZGxlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5qZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy5qZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmpkb20uSkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuamRvbS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmpkb20uaW5wdXQuU0FYQnVpbGRlcjsKLWltcG9ydCBvcmcuamRvbS5vdXRwdXQuWE1MT3V0cHV0dGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NIYW5kbGVyVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU5TID0gImhhbmRsZXItY2hhaW5zIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhBTkRMRVJfQ0hBSU4gPSAiaGFuZGxlci1jaGFpbiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSID0gImhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9OQU1FID0gImhhbmRsZXItbmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX0NMQVNTID0gImhhbmRsZXItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hbWVzcGFjZSBKQVZBRUVfTlMgPSBOYW1lc3BhY2UuZ2V0TmFtZXNwYWNlKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBKQVhXU0hhbmRsZXJVdGlscygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGFuZGxlckNoYWluRmlsZShJUGF0aCBwYXRoLCBTdHJpbmcgaGFuZGxlck5hbWUsIFN0cmluZyBoYW5kbGVyQ2xhc3MpIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICAgICAgaWYgKCFoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7fSksIHRydWUsIHByb2dyZXNzTW9uaXRvcik7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbnNFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbnNFbGVtZW50LnNldE5hbWVzcGFjZShKQVZBRUVfTlMpOwotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2hhaW5FbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9DSEFJTiwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUiwgSkFWQUVFX05TKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbmV3IEVsZW1lbnQoSEFORExFUl9OQU1FLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJOYW1lRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJOYW1lKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNsYXNzRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzRWxlbWVudC5zZXRUZXh0KGhhbmRsZXJDbGFzcyk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJOYW1lRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyQ2xhc3NFbGVtZW50KTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5zRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJDaGFpbkVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoaGFuZGxlckNoYWluc0VsZW1lbnQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgIFhNTE91dHB1dHRlciBvdXRwdXR0ZXIgPSBuZXcgWE1MT3V0cHV0dGVyKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0dGVyLm91dHB1dChkb2N1bWVudCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRYTUxGaWxlKGhhbmRsZXJDaGFpbkZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhhbmRsZXJDaGFpbkZpbGUoSVBhdGggcGF0aCkgewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoIWhhbmRsZXJDaGFpbkZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgdHJ1ZSwgcHJvZ3Jlc3NNb25pdG9yKTsKLQotICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNoYWluc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOUyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluc0VsZW1lbnQuc2V0TmFtZXNwYWNlKEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChoYW5kbGVyQ2hhaW5zRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coZm5mZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkSGFuZGxlclRvSGFuZGxlckNoYWluKElQYXRoIHBhdGgsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSAmJiBoYW5kbGVyQ2hhaW5GaWxlLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGhhbmRsZXJJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaGFuZGxlckNoYWluRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLSAgICAgICAgICAgICAgICBTQVhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU0FYQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5idWlsZChoYW5kbGVySW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldFJvb3RFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbkVsZW1lbnQgPSByb290LmdldENoaWxkKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NIQUlOLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgICAgICByb290LmFkZENvbnRlbnQoaGFuZGxlckNoYWluRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJOYW1lRWxlbWVudCA9IG5ldyBFbGVtZW50KEhBTkRMRVJfTkFNRSwgSkFWQUVFX05TKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVyTmFtZUVsZW1lbnQuc2V0VGV4dChoYW5kbGVyTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBuZXcgRWxlbWVudChIQU5ETEVSX0NMQVNTLCBKQVZBRUVfTlMpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzc0VsZW1lbnQuc2V0VGV4dChoYW5kbGVyQ2xhc3MpOwotCi0gICAgICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyTmFtZUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIGhhbmRsZXJFbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckNsYXNzRWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5FbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlckVsZW1lbnQpOwotCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXR0ZXIub3V0cHV0KGRvY3VtZW50LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGZuZmUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoSkRPTUV4Y2VwdGlvbiBqZG9tZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coamRvbWUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvL1RPRE8gQ2xvc2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudFRvRmlsZShJUGF0aCBmaWxlUGF0aCwgRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmIChpc0hhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgWE1MT3V0cHV0dGVyIG91dHB1dHRlciA9IG5ldyBYTUxPdXRwdXR0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHRlci5vdXRwdXQoZG9jdW1lbnQsIG91dHB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFhNTEZpbGUoaGFuZGxlckNoYWluRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coaW9lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0hhbmRsZXJEZWZpbmVkKElGaWxlIGhhbmRsZXJDaGFpbkZpbGUsIFN0cmluZyBoYW5kbGVyTmFtZSwgU3RyaW5nIGhhbmRsZXJDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5GaWxlKSkgewotICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgLnRvRmlsZSgpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0ZWFtKTsKLSAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuZ2V0Um9vdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEVsZW1lbnQ+IGhhbmRsZXJDaGFpbnMgPSByb290LmdldENoaWxkcmVuKEhBTkRMRVJfQ0hBSU4sIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbGVtZW50IGhhbmRsZXJDaGFpbiA6IGhhbmRsZXJDaGFpbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyID0gaGFuZGxlckNoYWluLmdldENoaWxkKEhBTkRMRVIsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gaGFuZGxlci5nZXRDaGlsZChIQU5ETEVSX05BTUUsIEpBVkFFRV9OUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBoYW5kbGVyLmdldENoaWxkKEhBTkRMRVJfQ0xBU1MsIEpBVkFFRV9OUyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTmFtZUVsZW1lbnQgIT0gbnVsbCAmJiBoYW5kbGVyTmFtZUVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGFuZGxlckNsYXNzRWxlbWVudCAhPSBudWxsICYmIGhhbmRsZXJDbGFzc0VsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyhoYW5kbGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKRE9NRXhjZXB0aW9uIGpkb21lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGhhbmRsZXJDaGFpbklucHV0U3RlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGFuZGxlckNoYWluRmlsZShJRmlsZSBoYW5kbGVyQ2hhaW5GaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGhhbmRsZXJDaGFpbklucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShoYW5kbGVyQ2hhaW5GaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgewotICAgICAgICAgICAgICAgIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZChoYW5kbGVyQ2hhaW5JbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgcm9vdCA9IGRvYy5nZXRSb290RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocm9vdC5nZXROYW1lKCkuZXF1YWxzKEhBTkRMRVJfQ0hBSU5TKSAmJiByb290LmdldE5hbWVzcGFjZSgpLmVxdWFscyhKQVZBRUVfTlMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqZG9tZSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNoYWluSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXRYTUxGaWxlKElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0UHJvY2Vzc29yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0UHJvY2Vzc29yLmZvcm1hdEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhpb2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvY29yZS91dGlscy9KQVhXU1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZTBkZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL2NvcmUvdXRpbHMvSkFYV1NVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci0KLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uTWlycm9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSkFYV1NVdGlscyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT04gPSAiYWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRSA9ICJjbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0NIQVJBQ1RFUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORFBPSU5UX0lOVEVSRkFDRSA9ICJlbmRwb2ludEludGVyZmFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFID0gImV4Y2x1ZGUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFVTFRfQkVBTiA9ICJmYXVsdEJlYW4iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklOQUxJWkUgPSAiZmluYWxpemUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSID0gImhlYWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhXU19TVUJQQUNLQUdFID0gImpheHdzIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX05BTUUgPSAibG9jYWxOYW1lIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREUgPSAibW9kZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElPTl9OQU1FID0gIm9wZXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NUWUxFID0gInBhcmFtZXRlclN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRfTkFNRSA9ICJwYXJ0TmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUUgPSAicG9ydE5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJSZXNwb25zZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9TVUZGSVggPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOID0gInJldHVybiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSAic2VydmljZU5hbWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9TVUZGSVggPSAiU2VydmljZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFID0gInRhcmdldE5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRSA9ICJ1c2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTiA9ICJ3c2RsTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIEpBWFdTVXRpbHMoKSB7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50QmFyZShBbm5vdGF0aW9uTWlycm9yIG1pcnJvcikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBVU0UpOwotICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUobWlycm9yLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgICAgICBTdHJpbmcgdXNlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBVU0UpOwotICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoc3R5bGUsIHVzZSwgcGFyYW1ldGVyU3R5bGUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbikgewotICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgVVNFKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtZXRlclN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBQQVJBTUVURVJfU1RZTEUpOwotCi0gICAgICAgIHJldHVybiBKQVhXU1V0aWxzLmlzRG9jdW1lbnRCYXJlKHN0eWxlLCB1c2UsIHBhcmFtZXRlclN0eWxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEb2N1bWVudEJhcmUoU3RyaW5nIHN0eWxlLCBTdHJpbmcgdXNlLCBTdHJpbmcgcGFyYW1ldGVyU3R5bGUpIHsKLSAgICAgICAgcmV0dXJuIChzdHlsZSA9PSBudWxsIHx8IHN0eWxlLmVxdWFscyhTdHlsZS5ET0NVTUVOVC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmICh1c2UgPT0gbnVsbCB8fCB1c2UuZXF1YWxzKFVzZS5MSVRFUkFMLm5hbWUoKSkpCi0gICAgICAgICAgICAgICAgJiYgKHBhcmFtZXRlclN0eWxlICE9IG51bGwgJiYgcGFyYW1ldGVyU3R5bGUuZXF1YWxzKFBhcmFtZXRlclN0eWxlLkJBUkUubmFtZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKEFubm90YXRpb25NaXJyb3IgbWlycm9yKSB7Ci0gICAgICAgIFN0cmluZyBzdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFNUWUxFKTsKLSAgICAgICAgU3RyaW5nIHVzZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShtaXJyb3IsIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RvY3VtZW50V3JhcHBlZChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFNUWUxFKTsKLSAgICAgICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyU3R5bGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFBBUkFNRVRFUl9TVFlMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLSAgICAgICAgU3RyaW5nIHN0eWxlID0gQW5ub3RhdGlvblV0aWxzLmdldEVudW1WYWx1ZShhbm5vdGF0aW9uLCBTVFlMRSk7Ci0gICAgICAgIFN0cmluZyB1c2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0RW51bVZhbHVlKGFubm90YXRpb24sIFVTRSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbWV0ZXJTdHlsZSA9IEFubm90YXRpb25VdGlscy5nZXRFbnVtVmFsdWUoYW5ub3RhdGlvbiwgUEFSQU1FVEVSX1NUWUxFKTsKLQotICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChzdHlsZSwgdXNlLCBwYXJhbWV0ZXJTdHlsZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRG9jdW1lbnRXcmFwcGVkKFN0cmluZyBzdHlsZSwgU3RyaW5nIHVzZSwgU3RyaW5nIHBhcmFtZXRlclN0eWxlKSB7Ci0gICAgICAgIHJldHVybiAoc3R5bGUgPT0gbnVsbCB8fCBzdHlsZS5lcXVhbHMoU3R5bGUuRE9DVU1FTlQubmFtZSgpKSkKLSAgICAgICAgICAgICAgICAmJiAodXNlID09IG51bGwgfHwgdXNlLmVxdWFscyhVc2UuTElURVJBTC5uYW1lKCkpKQotICAgICAgICAgICAgICAgICYmIChwYXJhbWV0ZXJTdHlsZSA9PSBudWxsIHx8IHBhcmFtZXRlclN0eWxlLmVxdWFscyhQYXJhbWV0ZXJTdHlsZS5XUkFQUEVELm5hbWUoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBnaXZlbiB7QGxpbmsgSU1ldGhvZH0gdG8gc2VlIGlmIGl0IGlzIGFuIG92ZXJsb2FkZWQgbWV0aG9kLiBJZiBpdCBpcyBpdCB3aWxsIHJldHVybgotICAgICAqIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcG9zaXRpb24gb2YgdGhpcyBtZXRob2QgaW4gaXQncyBwYXJlbnRzIHtAbGluayBJVHlwZX0uCi0gICAgICogPHA+Ci0gICAgICogRS5nLiBHaXZlbiB0aHJlZSBtZXRob2RzOgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIHZvaWQgbXlNZXRob2QoLi4uKTsKLSAgICAgKiBwdWJsaWMgdm9pZCBteU1ldGhvZCguLi4pOwotICAgICAqIHB1YmxpYyB2b2lkIG15TWV0aG9kKC4uLik7Ci0gICAgICogPC9wcmU+Ci0gICAgICogVGhlIGZpcnN0IG1ldGhvZCB3b3VsZCByZXR1cm4gYSBibGFuayBzdHJpbmcsIHRoZSBzZWNvbmQgd291bGQgcmV0dXJuIHRoZSBzdHJpbmcgIjEiIGFuZCB0aGUgdGhpcmQKLSAgICAgKiB3b3VsZCByZXR1cm4gdGhlIHN0cmluZyAiMiIuCi0gICAgICogPC9wPgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCB0byB0ZXN0Ci0gICAgICogQHJldHVybiBhIHN0cmluZyB2YWx1ZQotICAgICAqIEBleGNlcHRpb24gSmF2YU1vZGVsRXhjZXB0aW9uIHRocm93biBpZiBhbiBleGNlcHRpb24gb2NjdXJzIHdoaWxlIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyByZXNvdXJjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjY291bnRGb3JPdmVybG9hZGVkTWV0aG9kcyhJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgCUlUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgIAlpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gIiI7Ci0gICAgCX0KLSAgICAgICAgTGlzdDxJTWV0aG9kPiBtZXRob2RzID0gIEFycmF5cy5hc0xpc3QodHlwZS5nZXRNZXRob2RzKCkpOwotICAgICAgICBMaXN0PElNZXRob2Q+IHNpbWlsYXJNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICBmb3IgKElNZXRob2QgbWV0aG9kVG9UZXN0IDogbWV0aG9kcykgewotICAgICAgICAgICAgaWYgKCFtZXRob2QuZXF1YWxzKG1ldGhvZFRvVGVzdCkgJiYgbWV0aG9kLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kVG9UZXN0LmdldEVsZW1lbnROYW1lKCkpICYmIG1ldGhvZFRvVGVzdC5nZXRTb3VyY2VSYW5nZSgpLmdldE9mZnNldCgpIDwKLSAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkpIHsKLSAgICAgICAgICAgICAgICBzaW1pbGFyTWV0aG9kcy5hZGQobWV0aG9kVG9UZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2ltaWxhck1ldGhvZHMuc2l6ZSgpID4gMCA/IEludGVnZXIudG9TdHJpbmcoc2ltaWxhck1ldGhvZHMuc2l6ZSgpKSA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdXRpbHMvSkRUVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkMjlkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9KRFRVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5GbGFnczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKRFQgVXRpbGl0eSBjbGFzcy4KLSAqIDxwPgotICogPHN0cm9uZz5Qcm92aXNpb25hbCBBUEk6PC9zdHJvbmc+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0Ci0gKiB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzCi0gKiB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlscyB7Ci0KLSAgICBwcml2YXRlIEpEVFV0aWxzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIGFkZCB0aGUgY2xhc3NwYXRoIGVudHJ5IHRvCi0gICAgICogQHBhcmFtIGNsYXNzcGF0aEVudHJ5IHRoZSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IHRvIGFkZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGN1cnJlbnRFbnRyaWVzID0gQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSk7Ci0gICAgICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotICAgICAgICAgICAgbmV3RW50cmllcy5hZGRBbGwoY3VycmVudEVudHJpZXMpOwotICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5ICE9IG51bGwgJiYgIW5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5hZGQoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSA8Y29kZT5JQ2xhc3NwYXRoRW50cnk8L2NvZGU+IGZyb20gYSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+Ci0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSA8Y29kZT5JSmF2YVByb2plY3Q8L2NvZGU+IHRvIHJlbW92ZSB0aGUgY2xhc3NwYXRoIGVudHJ5IGZyb20KLSAgICAgKiBAcGFyYW0gY2xhc3NwYXRoRW50cnkgdGhlIDxjb2RlPklDbGFzc3BhdGhFbnRyeTwvY29kZT4gdG8gcmVtb3ZlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjdXJyZW50RW50cmllcyA9IEFycmF5cy5hc0xpc3QoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpOwotICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IG5ld0VudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLSAgICAgICAgICAgIG5ld0VudHJpZXMuYWRkQWxsKGN1cnJlbnRFbnRyaWVzKTsKLSAgICAgICAgICAgIGlmIChjbGFzc3BhdGhFbnRyeSAhPSBudWxsICYmIG5ld0VudHJpZXMuY29udGFpbnMoY2xhc3NwYXRoRW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgbmV3RW50cmllcy5yZW1vdmUoY2xhc3NwYXRoRW50cnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0VudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0VudHJpZXMuc2l6ZSgpXSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgcHJvamVjdCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgSmF2YSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb2plY3QgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBvZiB0aGUgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QuCi0gICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBmb2xkZXIgZm9yIHRoZSBnaXZlbiBqYXZhIHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0T3V0cHV0RGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSkuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0UGF0aCgpKS5nZXRMb2NhdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtIG9mIHRoZSBkZWZhdWx0IG91dHB1dCBsb2NhdGlvbiBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHJldHVybiAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGRlZmF1bHQgb3V0cHV0IGZvbGRlciBmb3IgdGhlIGdpdmVuIGphdmEgcHJvamVjdCBuYW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRKYXZhUHJvamVjdE91dHB1dERpcmVjdG9yeVBhdGgoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmdWxsLCBhYnNvbHV0ZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2Ugb2YgdGhlIHNvdXJjZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gdHlwZS4KLSAgICAgKiBAcGFyYW0gdHlwZSB0aGUgPGNvZGU+SVR5cGU8L2NvZGU+Ci0gICAgICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZ2l2ZW4gPGNvZGU+SVR5cGU8L2NvZGU+IHNvdXJjZSBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJVHlwZSB0eXBlKSB7Ci0gICAgICAgIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpOwotICAgICAgICBJUmVzb3VyY2Ugc3JjRGlyZWN0b3J5UmVzb3VyY2UgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCk7Ci0gICAgICAgIHJldHVybiBzcmNEaXJlY3RvcnlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgamF2YSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaXJzdCBzb3VyY2UgZm9sZGVyIGZvdW5kIGluIHRoZSBqYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZ1bGwsIGFic29sdXRlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZSBvZiB0aGUgZmlyc3Qgc291cmNlIGZvbGRlciBmb3VuZCBpbiB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPgotICAgICAqIEByZXR1cm4gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpcnN0IHNvdXJjZSBmb2xkZXIgZm91bmQgaW4gdGhlIGdpdmVuIGphdmEgcHJvamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElQYXRoIGdldEphdmFQcm9qZWN0U291cmNlRGlyZWN0b3J5UGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdOwotICAgICAgICAgICAgSVJlc291cmNlIHNyY0RpcmVjdG9yeVJlc291cmNlID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgcmV0dXJuIHNyY0RpcmVjdG9yeVJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFBhdGgoIiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYW4gaW50ZXJmYWNlIGFsbCBtZXRob2RzIGRlY2xhcmVkIGluIHRoYXQgaW50ZXJmYWNlIGFyZSByZXR1cm5lZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbHRlcm5hdGl2ZWx5IGlmIHRoZSBnaXZlbiBnaXZlbiA8Y29kZT5JVHlwZTwvY29kZT4gaXMgYSBjbGFzcywgb25seSBtZXRob2RzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkCi0gICAgICogcHVibGljIGFyZSByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHRoZSA8Y29kZT5JVHlwZTwvY29kZT4KLSAgICAgKiBAcmV0dXJuIHRoZSBwdWJsaWMgbWV0aG9kcyBkZWNsYXJlZCBpbiB0aGlzIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElNZXRob2RbXSBnZXRQdWJsaWNNZXRob2RzKElUeXBlIHR5cGUpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kPiBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kPigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSU1ldGhvZFtdIGFsbE1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLSAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWxsTWV0aG9kczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gYWxsTWV0aG9kc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoRmxhZ3MuaXNQdWJsaWMobWV0aG9kLmdldEZsYWdzKCkpICYmICFtZXRob2QuaXNDb25zdHJ1Y3RvcigpICYmICFtZXRob2QuaXNNYWluTWV0aG9kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTQ29yZVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHVibGljTWV0aG9kcy50b0FycmF5KG5ldyBJTWV0aG9kW3B1YmxpY01ldGhvZHMuc2l6ZSgpXSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIHRhcmdldCBuYW1lc3BhY2Ugc3RyaW5nIGZyb20gdGhlIGdpdmVuIHBhY2thZ2UgbmFtZSBieSBzcGxpdHRpbmcgdGhlIGRvdCAnLicgc2VwYXJhdGVkCi0gICAgICogcGFja2FnZSBuYW1lLCByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSBwYWNrYWdlIG5hbWUgc2VnbWVudHMgZm9sbG93ZWQgYnkgcHJlZml4aW5nIHRoZSBzdHJpbmcgd2l0aAotICAgICAqICdodHRwOi8vJyBhbmQgYXBwZW5kaW5nIGEgZm9yd2FyZCBzbGFzaCAnLycgdG8gdGhlIGVuZC4KLSAgICAgKiA8cD5FLmcuLCB0aGUgSmF2YSBwYWNrYWdlINJjb20uZXhhbXBsZS53c9Mgd291bGQgcmV0dXJuIHRoZSB0YXJnZXQgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0y48L3A+Ci0gICAgICogPHA+SWYgdGhlIHBhY2thZ2UgbmFtZSBpcyBudWxsIG9yIGlzIG9mIHplcm8gbGVuZ3RoICAiaHR0cDovL2RlZmF1bHRfcGFja2FnZS8iIGlzIHJldHVybmVkLjwvcD4KLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGRlcml2ZWQgdGFyZ2V0IG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuICJodHRwOi8vZGVmYXVsdF9wYWNrYWdlLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXNwYWNlRWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KHBhY2thZ2VOYW1lLnNwbGl0KCJcXC4iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShuYW1lc3BhY2VFbGVtZW50cyk7Ci0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiaHR0cDovLyI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzcGFjZUl0ZXJhdG9yID0gbmFtZXNwYWNlRWxlbWVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnQgPSBuYW1lc3BhY2VJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0TmFtZXNwYWNlICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXROYW1lc3BhY2UgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRhcmdldE5hbWVzcGFjZSArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB0eXBlIGZvdW5kIGZvbGxvd2luZyB0aGUgZ2l2ZW4gamF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIHdpdGggdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9yIG51bGwgaWYgbm9uZSBpcyBmb3VuZC4KLSAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIGdpdmVuIDxjb2RlPklKYXZhUHJvamVjdDwvY29kZT4KLSAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgdGhlIGdpdmVuIGZ1bGx5IHF1YWxpZmllZCBuYW1lCi0gICAgICogQHJldHVybiB0aGUgZmlyc3QgdHlwZSBmb3VuZCBmb2xsb3dpbmcgdGhlIGphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElUeXBlIGZpbmRUeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmlyc3QgdHlwZSBmb3VuZCB3aXRoIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb2xsb3dpbmcgdGhlIGNsYXNzcGF0aCBvZiB0aGUgamF2YSBwcm9qZWN0IHdpdGgKLSAgICAgKiB0aGUgZ2l2ZSBwcm9qZWN0IG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgamF2YSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lIHRoZSBnaXZlbiBmdWxseSBxdWFsaWZpZWQgbmFtZQotICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHR5cGUgZm91bmQgZm9sbG93aW5nIHRoZSBqYXZhIHByb2plY3QncyBjbGFzc3BhdGggd2l0aCB0aGUgZ2l2ZW4gZnVsbHkgcXVhbGlmaWVkIG5hbWUgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJVHlwZSBmaW5kVHlwZShTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZmluZFR5cGUoSkRUVXRpbHMuZ2V0SmF2YVByb2plY3QocHJvamVjdE5hbWUpLCBmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUuCi0gICAgICogQHBhcmFtIHByb2plY3QgdGhlIGdpdmVuIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGhhcyB0aGUgamF2YSBuYXR1cmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGlzbid0IGEgbWFpbiBtZXRob2Qgb3IgY29uc3RydWN0b3IgYW5kIGlmIGl0IGhhcyB0aGUgcHVibGljIG1vZGlmaWVyLgotICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIGdpdmVuIG1ldGhvZAotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1ldGhvZCBpcyBwdWJsaWMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQdWJsaWNNZXRob2QoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIW1ldGhvZC5pc0NvbnN0cnVjdG9yKCkgJiYgIW1ldGhvZC5pc01haW5NZXRob2QoKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NDb3JlUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIHdvcmtzcGFjZSBzb3VyY2UgYW5kIGNvbXBsaWFuY2UgbGV2ZWxzLgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGEgdHlwZQotICAgICAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0IHdpdGggY29kZSBJU3RhdHVzLk9LIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGFzIGEgSmF2YSB0eXBlIG5hbWUsIGEgc3RhdHVzIHdpdGgKLSAgICAgKiBjb2RlIElTdGF0dXMuV0FSTklORyBpbmRpY2F0aW5nIHdoeSB0aGUgZ2l2ZW4gbmFtZSBpcyBkaXNjb3VyYWdlZCwgb3RoZXJ3aXNlIGEgc3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUphdmFUeXBlTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgc291cmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfU09VUkNFKTsKLSAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLSAgICAgICAgcmV0dXJuIEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZShuYW1lLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEphdmEgdHlwZSBuYW1lLCBlaXRoZXIgc2ltcGxlIG9yIHF1YWxpZmllZCwgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIHR5cGUKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyB2YWxpZCBhcyBhIEphdmEgdHlwZSBuYW1lLCBhIHN0YXR1cyB3aXRoCi0gICAgICogY29kZSBJU3RhdHVzLldBUk5JTkcgaW5kaWNhdGluZyB3aHkgdGhlIGdpdmVuIG5hbWUgaXMgZGlzY291cmFnZWQsIG90aGVyd2lzZSBhIHN0YXR1cyBvYmplY3QgaW5kaWNhdGluZyB3aGF0IGlzIHdyb25nIHdpdGggdGhlIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVKYXZhVHlwZU5hbWUoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKRFRVdGlscy5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VMZXZlbCA9IGphdmFQcm9qZWN0LmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9TT1VSQ0UsIHRydWUpOwotICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UsIHRydWUpOwotICAgICAgICByZXR1cm4gSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlSmF2YVR5cGVOYW1lKG5hbWUsIHNvdXJjZUxldmVsLCBjb21wbGlhbmNlTGV2ZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUgdXNpbmcgdGhlIGdpdmVuIHByb2plY3RzIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSBqYXZhIHByb2plY3QKLSAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIG5hbWUgb2YgYSBwYWNrYWdlCi0gICAgICogQHJldHVybiBhIHN0YXR1cyBvYmplY3Qgd2l0aCBjb2RlIElTdGF0dXMuT0sgaWYgdGhlIGdpdmVuIG5hbWUgaXMgdmFsaWQgYXMgYSBwYWNrYWdlIG5hbWUsIG90aGVyd2lzZSBhIHN0YXR1cwotICAgICAqIG9iamVjdCBpbmRpY2F0aW5nIHdoYXQgaXMgd3Jvbmcgd2l0aCB0aGUgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVBhY2thZ2VOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEpEVFV0aWxzLmdldEphdmFQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gamF2YVByb2plY3QuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBqYXZhUHJvamVjdC5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSwgc291cmNlTGV2ZWwsIGNvbXBsaWFuY2VMZXZlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBKYXZhIGlkZW50aWZpZXIgd2l0aCB0aGUgd29ya3NwYWNlIHNvdXJjZSBhbmQgY29tcGxpYW5jZSBsZXZlbHMuCi0gICAgICogQHBhcmFtIGlkIHRoZSBKYXZhIGlkZW50aWZpZXIKLSAgICAgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB3aXRoIGNvZGUgSVN0YXR1cy5PSyBpZiB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciwgb3RoZXJ3aXNlCi0gICAgICogYSBzdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgd2hhdCBpcyB3cm9uZyB3aXRoIHRoZSBpZGVudGlmaWVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLSAgICAgICAgU3RyaW5nIHNvdXJjZUxldmVsID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX1NPVVJDRSk7Ci0gICAgICAgIFN0cmluZyBjb21wbGlhbmNlTGV2ZWwgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7Ci0gICAgICAgIHJldHVybiBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVJZGVudGlmaWVyKGlkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS91dGlscy9XU0RMVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ5YTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3V0aWxzL1dTRExVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQnVnICMyNzQyOTMgLSBzdWRoYW5AcHJvZ3Jlc3MuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC53c2RsLkRlZmluaXRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5Qb3J0OwotaW1wb3J0IGphdmF4LndzZGwuU2VydmljZTsKLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLlNPQVBBZGRyZXNzOwotaW1wb3J0IGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwMTIuU09BUDEyQWRkcmVzczsKLWltcG9ydCBqYXZheC53c2RsLmZhY3RvcnkuV1NETEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgud3NkbC54bWwuV1NETFJlYWRlcjsKLWltcG9ydCBqYXZheC53c2RsLnhtbC5XU0RMV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLlVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBXU0RMIFV0aWxpdHkgY2xhc3MuCi0gKiA8cD4KLSAqIDxzdHJvbmc+UHJvdmlzaW9uYWwgQVBJOjwvc3Ryb25nPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdAotICogdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcwotICogdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV1NETFV0aWxzIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9GSUxFX05BTUVfUEFUVEVSTiA9ICJbYS16QS1aMC05X1xcLV0rLndzZGwiOy8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9RVUVSWSA9ICI/d3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdTRExfRk9MREVSX1BBVEggPSBuZXcgUGF0aCgid3NkbC8iKTsgLy8kTk9OLU5MUy0xJAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUID0gMzAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0ZJTEVfRVhURU5TSU9OID0gIi53c2RsIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBXU0RMVXRpbHMoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gYnkgcmVhZGluZyB0aGUgV1NETCBkb2N1bWVudCBhdCB0aGUgZ2l2ZW4gVVJMIG9yIG51bGwgaWYgbm9uZSBjYW4gYmUgZm91bmQKLSAgICAgKiBvciBpZiB0aGUgY29ubmVjdGlvbiB0aW1lcyBvdXQuCi0gICAgICogQHBhcmFtIHdzZGxVUkwgdGhlIHVybCBvZiB0aGUgd3NkbCBkb2N1bWVudCB0byByZWFkLgotICAgICAqIEByZXR1cm4gdGhlIGRlZmluaXRpb24gZGVzY3JpYmVkIGluIHRoZSB3c2RsIGRvY3VtZW50IHBvaW50ZWQgdG8gYnkgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBleGNlcHRpb24gb2NjdXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRGVmaW5pdGlvbiByZWFkV1NETChVUkwgd3NkbFVSTCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uID0gd3NkbFVSTC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldENvbm5lY3RUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICB1cmxDb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KFRJTUVPVVQpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExSZWFkZXIgd3NkbFJlYWRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExSZWFkZXIoKTsKLSAgICAgICAgICAgIERlZmluaXRpb24gZGVmaW5pdGlvbiA9IHdzZGxSZWFkZXIucmVhZFdTREwod3NkbFVSTC5nZXRQYXRoKCksIGlucHV0U291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBkZWZpbml0aW9uOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIDxjb2RlPmphdmF4LndzZGwuRGVmaW5pdGlvbjwvY29kZT4gdG8gdGhlIHdzZGwgZG9jdW1lbnQgYXQgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAcGFyYW0gd3NkbFVSTCB0aGUgdXJsIG9mIHRoZSB3c2RsIGRvY3VtZW50IHRvIHdyaXRlIHRvLgotICAgICAqIEBwYXJhbSBkZWZpbml0aW9uIHRoZSBXU0RMIGRlZmluaXRpb24gdG8gYmUgd3JpdHRlbi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXhjZXB0aW9uIG9jY3Vycy4KLSAgICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycyByZWZyZXNoaW5nIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgaWYgaXQgZXhpc3RzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVdTREwoVVJMIHdzZGxVUkwsIERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgVVJJIHdzZGxVUkkgPSBudWxsOwotICAgICAgICBPdXRwdXRTdHJlYW0gd3NkbE91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3c2RsVVJJID0gd3NkbFVSTC50b1VSSSgpOwotICAgICAgICAgICAgRmlsZSB3c2RsRmlsZSA9IG5ldyBGaWxlKHdzZGxVUkkpOwotICAgICAgICAgICAgd3NkbE91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdzZGxGaWxlKTsKLSAgICAgICAgICAgIFdTRExGYWN0b3J5IHdzZGxGYWN0b3J5ID0gV1NETEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIFdTRExXcml0ZXIgd3NkbFdyaXRlciA9IHdzZGxGYWN0b3J5Lm5ld1dTRExXcml0ZXIoKTsKLSAgICAgICAgICAgIHdzZGxXcml0ZXIud3JpdGVXU0RMKGRlZmluaXRpb24sIHdzZGxPdXRwdXRTdHJlYW0pOwotICAgICAgICB9IGNhdGNoIChXU0RMRXhjZXB0aW9uIHdzZGxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHdzZGxlKTsKLSAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaXNlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKHVyaXNlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh3c2RsT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3c2RsT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsZUZvckxvY2F0aW9uKFVSSVV0aWwudG9QYXRoKHdzZGxVUkkpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmlsZSBuYW1lIGNvbnRhaW5zIEFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCB1bmRlcnNjb3JlICdfJywKLSAgICAgKiBkYXNoZXMgJy0nIGFuZCBlbmRzIHdpdGggdGhlICcud3NkbCcgZXh0ZW5zaW9uLiBPdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0gICAgICogQHBhcmFtIHdzZGxGaWxlTmFtZSB0aGUgd3NkbCBmaWxlIG5hbWUKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHZhbGlkLCBjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXU0RMRmlsZU5hbWUoU3RyaW5nIHdzZGxGaWxlTmFtZSkgewotICAgICAgICByZXR1cm4gd3NkbEZpbGVOYW1lICE9IG51bGwgJiYgd3NkbEZpbGVOYW1lLm1hdGNoZXMoV1NETF9GSUxFX05BTUVfUEFUVEVSTik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgV2ViIENvbnRlbnQgZm9sZGVyIG9mIHRoZSBnaXZlbiBwcm9qZWN0LiBUaGUgcmV0dXJuZWQgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElGb2xkZXIgZ2V0V2ViQ29udGVudEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcigKLSAgICAgICAgICAgICAgICBXU0RMVXRpbHMuZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIFdTREwgZm9sZGVyIG9mIHRoZSBwcm9qZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuIFRoZSBXU0RMIGZvbGRlciBwYXRoIGlzIHRoZSBwcm9qZWN0cyB3ZWIgY29udGVudCBmb2xkZXIKLSAgICAgKiBwYXRoIGFwcGVuZGVkIHdpdGggdGhlICdXU0RMJyBkaXJlY3RvcnkuIFRoZSByZXR1cm5lZCByZXNvdXJjZSBtYXkgbm90IGV4aXN0LgotICAgICAqIEBwYXJhbSBwcm9qZWN0TmFtZSB0aGUgbmFtZSBvZiB0aGUgd2ViIHByb2plY3QKLSAgICAgKiBAcmV0dXJuIHRoZSB3c2RsIGZvbGRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgSUZvbGRlciBnZXRXU0RMRm9sZGVyKFN0cmluZyBwcm9qZWN0TmFtZSkgewotICAgICAgICByZXR1cm4gV1NETFV0aWxzLmdldFdTRExGb2xkZXIoV1NETFV0aWxzLmdldFByb2plY3QocHJvamVjdE5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBXU0RMIGZvbGRlciBvZiB0aGUgZ2l2ZW4gcHJvamVjdC4gVGhlIFdTREwgZm9sZGVyIHBhdGggaXMgdGhlIHByb2plY3RzIHdlYiBjb250ZW50IGZvbGRlcgotICAgICAqIHBhdGggYXBwZW5kZWQgd2l0aCB0aGUgJ1dTREwnIGRpcmVjdG9yeS4gVGhlIHJldHVybmVkIHJlc291cmNlIG1heSBub3QgZXhpc3QuCi0gICAgICogQHBhcmFtIHByb2plY3ROYW1lIHRoZSBuYW1lIG9mIHRoZSB3ZWIgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIHdzZGwgZm9sZGVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRm9sZGVyIGdldFdTRExGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICBJUGF0aCB3c2RsRm9sZGVyUGF0aCA9IFdTRExVdGlscy5nZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KS5hcHBlbmQoV1NETFV0aWxzLldTRExfRk9MREVSX1BBVEgpOwotICAgICAgICBJRm9sZGVyIHdzZGxGb2xkZXIgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZvbGRlcih3c2RsRm9sZGVyUGF0aCk7Ci0gICAgICAgIGlmICghd3NkbEZvbGRlci5leGlzdHMoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3c2RsRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd3NkbEZvbGRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgcmV0dXJuIHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4KLSAgICAgKiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmluaXRpb24uCi0gICAgICogQHJldHVybiByZXR1cm4gb25lIG9mOgotICAgICAqIDxsaT5TT0FQQWRkcmVzczxsaT5TT0FQMTJBZGRyZXNzPGxpPm51bGwgaWYgaXQgY2FuIG5vdCBmaW5kIGEgc29hcCBhZGRyZXNzCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHN0YXRpYyBFeHRlbnNpYmlsaXR5RWxlbWVudCBnZXRFbmRwb2ludEFkZHJlc3MoRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0gICAgICAgIGlmIChkZWZpbml0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1hcCBzZXJ2aWNlc01hcCA9IGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLSAgICAgICAgICAgIFNldDxNYXAuRW50cnk+IHNlcnZpY2VzU2V0ID0gc2VydmljZXNNYXAuZW50cnlTZXQoKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5IHNlcnZpY2VFbnRyeSA6IHNlcnZpY2VzU2V0KSB7Ci0gICAgICAgICAgICAgICAgU2VydmljZSBzZXJ2aWNlID0gKFNlcnZpY2UpIHNlcnZpY2VFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIE1hcCBwb3J0c01hcCA9IHNlcnZpY2UuZ2V0UG9ydHMoKTsKLSAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PiBwb3J0c1NldCA9IHBvcnRzTWFwLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgcG9ydEVudHJ5IDogcG9ydHNTZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUG9ydCBwb3J0ID0gKFBvcnQpIHBvcnRFbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IHBvcnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGV4dGVuc2liaWxpdHlFbGVtZW50cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNPQVBBZGRyZXNzIHx8IG9iamVjdCBpbnN0YW5jZW9mIFNPQVAxMkFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4dGVuc2liaWxpdHlFbGVtZW50KSBvYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbG9jYXRpb24gVVJJIGZyb20gdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZAotICAgICAqIGluIHRoZSBnaXZlbiA8Y29kZT5EZWZpbml0aW9uPC9jb2RlPiBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuIFRoZSByZXR1cm5lZCBsb2NhdGlvbiBVUkkgaXMgYXBwZW5kZWQgd2l0aAotICAgICAqIHRoZSAnP3dzZGwnIHF1ZXJ5IGlmIHRoZSBxdWVyeSB3YXMgbm90IHByZXNlbnQgaW4gdGhlIDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBsb2NhdGlvbiBVUkkuCi0gICAgICogQHBhcmFtIGRlZmluaXRpb24gdGhlIGdpdmVuIGRlZmludGlvbi4KLSAgICAgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBVUkkgb3IgdGhlIGZpcnN0IDxjb2RlPlNPQVBBZGRyZXNzPC9jb2RlPiBvciA8Y29kZT5TT0FQMTJBZGRyZXNzPC9jb2RlPiBmb3VuZCBpbiB0aGUgZ2l2ZW4gZGVmaW5pdGlvbi4KLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgdGVzdGluZyB0aGUgbG9jYXRpb24gVVJJIGZvciBhIHF1ZXJ5IHBhcnQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NETExvY2F0aW9uKERlZmluaXRpb24gZGVmaW5pdGlvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4dGVuc2liaWxpdHlFbGVtZW50IGV4dGVuc2liaWxpdHlFbGVtZW50ID0gV1NETFV0aWxzLmdldEVuZHBvaW50QWRkcmVzcyhkZWZpbml0aW9uKTsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvblVSSSA9IGdldExvY2F0aW9uVVJJKGV4dGVuc2liaWxpdHlFbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChsb2NhdGlvblVSSS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBVUkwgZW5kcG9pbnRVUkwgPSBuZXcgVVJMKGxvY2F0aW9uVVJJKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kcG9pbnRVUkwuZ2V0UXVlcnkoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uVVJJICs9IFdTRExfUVVFUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvblVSSTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkkoRXh0ZW5zaWJpbGl0eUVsZW1lbnQgZXh0ZW5zaWJpbGl0eUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGV4dGVuc2liaWxpdHlFbGVtZW50IGluc3RhbmNlb2YgU09BUEFkZHJlc3MpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFNPQVBBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0ZW5zaWJpbGl0eUVsZW1lbnQgaW5zdGFuY2VvZiBTT0FQMTJBZGRyZXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChTT0FQMTJBZGRyZXNzKSBleHRlbnNpYmlsaXR5RWxlbWVudCkuZ2V0TG9jYXRpb25VUkkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgZG90IHNlcGFyYXRlZCBwYWNrYWdlIG5hbWUgZnJvbSBhIGdpdmVuIG5hbWVzcGFjZS4KLSAgICAgKiA8cD5FLmcuLCB0aGUgbmFtZXNwYWNlINJodHRwOi8vd3MuZXhhbXBsZS5jb20v0yB3b3VsZCByZXR1cm4gdGhlIEphdmEgcGFja2FnZSBuYW1lINJjb20uZXhhbXBsZS53c9MuPC9wPgotICAgICAqIDxwPk4uQi4gVGhpcyBtZXRob2QgZG9lcyBub3QgcHJlc2VydmUgJ3d3dycgaW4gdGhlIHJldHVybmVkIHBhY2thZ2UgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS48L3A+Ci0gICAgICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBAcmV0dXJuIGEgcGFja2FnZSBuYW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lRnJvbU5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFja2FnZU5hbWVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgICAgICBVUkwgbmFtZXNwYWNlVVJMID0gbmV3IFVSTChuYW1lc3BhY2UpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgd3d3IGlmIHRoZXJlCi0gICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5ID0gbmFtZXNwYWNlVVJMLmdldEF1dGhvcml0eSgpOwotICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5pbmRleE9mKCJ3d3ciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cmluZyhhdXRob3JpdHkuaW5kZXhPZigiLiIpICsgMSwgYXV0aG9yaXR5Lmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gYXV0aG9yaXR5RWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KGF1dGhvcml0eS5zcGxpdCgiXFwuIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGF1dGhvcml0eUVsZW1lbnRzKTsKLSAgICAgICAgICAgIHBhY2thZ2VOYW1lRWxlbWVudHMuYWRkQWxsKGF1dGhvcml0eUVsZW1lbnRzKTsKLQotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBuYW1lc3BhY2VVUkwuZ2V0UGF0aCgpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhFbGVtZW50cyA9IEFycmF5cy5hc0xpc3QocGF0aC5zcGxpdCgiWy9cXFxcXSIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcGFja2FnZU5hbWVFbGVtZW50cy5hZGRBbGwocGF0aEVsZW1lbnRzKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBwYWNrYWdlSXRlcmF0b3IgPSBwYWNrYWdlTmFtZUVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAocGFja2FnZUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtZW50ID0gcGFja2FnZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lICs9IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSArPSAiLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0gICAgICAgICAgICBKQVhXU0NvcmVQbHVnaW4ubG9nKG11cmxlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGFja2FnZU5hbWUudG9Mb3dlckNhc2UoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiMTlhZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWY1Yjc0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb247c2luZ2xldG9uOj10cnVlDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpkdC51aSwNCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwNCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aSwNCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWksDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlDQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkNCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDEwYWZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAxMWQ5OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgaWNvbnMvDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL2ljb25zL2pheHdzX25hdmNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9pY29ucy9qYXh3c19uYXZjb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzdjYjg5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9RE9NIEludGVncmF0aW9uIChJbmN1YmF0aW9uKQ0KLUJ1bmRsZS1WZW5kb3IuMD1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLURvbVZhbGlkYXRvcl9OYW1lID0gV2ViIFNlcnZpY2VzIFZhbGlkYXRpb24NCi1Eb21WYWxpZGF0aW9uX01hcmtlck5hbWUgPSBXZWIgU2VydmljZXMgUHJvYmxlbSBNYXJrZXINCi1uYXZpZ2F0b3JDb250ZW50Lm5hbWUuMCA9IEpBWC1XUyBXZWIgU2VydmljZXMgRWxlbWVudHMNCi1kZWNvcmF0b3IubGFiZWwuMCA9IFdlYiBTZXJ2aWNlIERlY29yYXRvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU4YTBhNTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgIAotICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkgCi0JCQl1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiAKLQkJCWNsYXNzID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLQkJCXN1cHBvcnRlZFR5cGVzID0gCi0JCQkJIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0JCQkJb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLSAgPCEtLSB7e3sgRGVmaW5lcyBpbnRlZ3JhdGlvbiBmb3IgRE9NIG9iamVjdHMgdG8gbmF2aWdhdGlvbiB0cmVlIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4gCi0JCTxuYXZpZ2F0b3JDb250ZW50Ci0gICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvamF4d3NfbmF2Y29udGVudC5naWYiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QubmF2aWdhdG9yLmoyZWUudWkuamF4d3MiCi0gICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iJW5hdmlnYXRvckNvbnRlbnQubmFtZS4wIgotICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0JCQk8dHJpZ2dlclBvaW50cz4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgLz4KLQkJCQk8L29yPgotCQkJPC90cmlnZ2VyUG9pbnRzPgotCQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiLz4KLQkJCQk8L29yPgotCQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQkJPGFjdGlvblByb3ZpZGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMuV1NBY3Rpb25Qcm92aWRlciIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9ucy5XU0FjdGlvblByb3ZpZGVyIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPG9yPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIi8+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCIvPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtIi8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPC9uYXZpZ2F0b3JDb250ZW50PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotCQk8ZGVjb3JhdG9yCi0JCQlhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iQk9UVE9NX1JJR0hUIgotICAgICAgICAgICAgbGlnaHR3ZWlnaHQ9ImZhbHNlIgotICAgICAgICAgICAgbGFiZWw9IiVkZWNvcmF0b3IubGFiZWwuMCIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5XZWJTZXJ2aWNlRGVjb3JhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklTRUlDaGlsZExpc3QiLz4KLQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0Ii8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kIi8+Ci0JCQkJCTxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSIvPgotCQkJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgPCEtLSB9fX0gLS0+Ci0gIDwhLS0ge3t7IERlZmluZXMgaW50ZWdyYXRpb24gZm9yIERPTSBvYmplY3RzIHRvIHByb3BlcnRpZXMgdmlldyAtLT4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyCi0JCQkJdHlwZT0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlciI+Ci0JCQk8L2FkYXB0ZXI+Ci0JCTwvZmFjdG9yeT4KLQkJPGZhY3RvcnkKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXIiPgotCQkJPC9hZGFwdGVyPgotCQk8L2ZhY3Rvcnk+Ci0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0iCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkiPgotCQkJPGFkYXB0ZXIKLQkJCQl0eXBlPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklET01Qcm9wZXJ0eVZhbHVlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeSI+Ci0JCQk8YWRhcHRlcgotCQkJCXR5cGU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlIj4KLQkJCTwvYWRhcHRlcj4KLQkJPC9mYWN0b3J5PgkJCi0gICA8L2V4dGVuc2lvbj4KLTwhLS0gfX19IC0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYjFhNmQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25NZXNzYWdlcyBleHRlbmRzIE5MUw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfU2VpTGFiZWw7DQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9XZWJTZXJ2aWNlc0xhYmVsOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQ0KLQkvKiogbWVzc2FnZSBjb25zdGFudCAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luRUpCQXJlYUFjdGlvbjsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERvbUludGVncmF0aW9uTWVzc2FnZXMuY2xhc3MpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5MjczNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3BsdWdpbi9Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0pheFdzV2ViU2VydmljZXNMYWJlbAkJPSBKQVgtV1MgV2ViIFNlcnZpY2VzDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdDYW5jZWxlZExhYmVsCQkJPSBMb2FkaW5nIENhbmNlbGVkDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX0xvYWRpbmdEdW1teUxhYmVsCQkJPSBMb2FkaW5nLi4uDQotRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1NlaUxhYmVsCQkJCQkJPSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMNCi1ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfV2ViU2VydmljZXNMYWJlbAkJCQk9IFdlYiBTZXJ2aWNlcw0KLQ0KLU9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUJCQkJCQkJCQk9IE9wZW4NCi0NCi1OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uCT0gTG9jYXRlIGluIFdlYiBTZXJ2aWNlcyBOb2RlDQotTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uX1Nob3dJbkVKQkFyZWFBY3Rpb24JCQk9IExvY2F0ZSBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3IgTm9kZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC9wbHVnaW4vRG9tSW50ZWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmE5YWIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vaW50ZXJuYWwvcGx1Z2luL0RvbUludGVncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tSW50ZWdyYXRpb25QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsNCi0NCi0JLy8gVGhlIHBsdWctaW4gSUQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24iOw0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIHBsdWdpbjsNCi0JDQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7DQotCQ0KLQkvKioNCi0JICogVGhlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRG9tSW50ZWdyYXRpb25QbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbUludGVncmF0aW9uUGx1Z2luIGdldERlZmF1bHQoKSB7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldExhYmVsUHJvdmlkZXIoZmluYWwgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShsYWJlbFByb3ZpZGVyLCAibGFiZWxQcm92aWRlciIpOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOw0KLQl9DQotCQ0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsNCi0JfQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL2ludGVybmFsL3V0aWwvUHJvamVjdEV4cGxvcmVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MmY2OGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9pbnRlcm5hbC91dGlsL1Byb2plY3RFeHBsb3JlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB0aGF0IGhvbGRzIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBQcm9qZWN0RXhwbG9yZXIgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0RXhwbG9yZXJVdGlsIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9qZWN0RXhwbG9yZXJVdGlsIElOU1RBTkNFID0gbmV3IFByb2plY3RFeHBsb3JlclV0aWwoKTsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbSBVSSB0aHJlYWQgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgZXhwbG9yZXIge0BsaW5rIElWaWV3UGFydH0gaW4gY2FzZSBpdCBpcyBhdmFpbGFibGUgb3RoZXJ3aXNlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSVZpZXdQYXJ0IGZpbmRQcm9qZWN0RXhwbG9yZXIoKQ0KLQl7DQotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7DQotCQlpZiAod29ya2JlbmNoV2luPT1udWxsIHx8IHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdvcmtiZW5jaFdpbi5nZXRBY3RpdmVQYWdlKCkuZmluZFZpZXcoIm9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTVmMjUyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0N1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgd2l0aCBJdGVtIHByb3ZpZGVyIGFkYXB0ZXJzLiBGb3Ige0BsaW5rIElTRUlDaGlsZExpc3R9IGFuZCANCi0gKiB7QGxpbmsgSVdlYlNlcnZpY2VDaGlsZExpc3R9IGl0IGNyZWF0ZXMgc3BlY2lmaWMgYWRhcHRlciBmb3Igb3RoZXIgRE9NIG9iamVjdHMgZGVsZWdhdGVzIHRvDQotICoge0BsaW5rIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fS4NCi0gKiANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgDQotew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwcml2YXRlIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgDQotCXsNCi0JCXN1cGVyKCk7DQotCQkNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJV2ViU2VydmljZUNoaWxkTGlzdC5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVNFSUNoaWxkTGlzdC5jbGFzcyk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQ2hpbGRMaXN0QWRhcHRlcihmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qKSANCi0Jew0KLQkJcmV0dXJuIG5ldyBJV2ViU2VydmljZUNoaWxkTGlzdCgpDQotCQkJew0KLQkJCQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvai5nZXRXZWJTZXJ2aWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUlTRUlDaGlsZExpc3RBZGFwdGVyKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2opIA0KLQl7DQotCQlyZXR1cm4gbmV3IElTRUlDaGlsZExpc3QoKQ0KLQkJCXsNCi0JCQkJcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2ouZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvajsNCi0JCQkJfQ0KLQ0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSANCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgDQotCQkJCXsNCi0JCQkJCS8vIG5vIHByb2Nlc3NpbmcgbmVlZGVkIGN1cnJlbnRseQ0KLQkJCQl9DQotDQotCQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIA0KLQkJCQl7DQotCQkJCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZCBjdXJyZW50bHkNCi0JCQkJfQ0KLQkJCX07DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpDQotCXsNCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCAmJiB0eXBlIGluc3RhbmNlb2YgQ2xhc3MpDQotCQl7DQotCQkJaWYodHlwZS5lcXVhbHMoSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGFkYXB0SVdlYlNlcnZpY2VDaGlsZExpc3QoKElXZWJTZXJ2aWNlUHJvamVjdClub3RpZmllcik7DQotCQkJfQ0KLQkJCWVsc2UgaWYodHlwZS5lcXVhbHMoSVNFSUNoaWxkTGlzdC5jbGFzcykpDQotCQkJew0KLQkJCQlyZXR1cm4gYWRhcHRJU0VJQ2hpbGRMaXN0KChJV2ViU2VydmljZVByb2plY3Qpbm90aWZpZXIpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0eXBlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgYWRhcHRJU0VJQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpIHsNCi0JCQkJcmV0dXJuIGFkYXB0ZXI7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlmaW5hbCBBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVJU0VJQ2hpbGRMaXN0QWRhcHRlcih3c1Byb2plY3QpOw0KLQkJYXNzb2NpYXRlKGFkYXB0ZXIsIHdzUHJvamVjdCk7DQotCQkNCi0JCXJldHVybiBhZGFwdGVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgQWRhcHRlciBhZGFwdElXZWJTZXJ2aWNlQ2hpbGRMaXN0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCWZvcihBZGFwdGVyIGFkYXB0ZXIgOiB3c1Byb2plY3QuZUFkYXB0ZXJzKCkpDQotCQl7DQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgQWRhcHRlciBhZGFwdGVyID0gY3JlYXRlSVdlYlNlcnZpY2VDaGlsZExpc3RBZGFwdGVyKHdzUHJvamVjdCk7DQotCQlhc3NvY2lhdGUoYWRhcHRlciwgd3NQcm9qZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGFkYXB0ZXI7CQkNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVjMGUzZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnV0aWwuUHJvamVjdEV4cGxvcmVyVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdDYW5jZWxlZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSUxvYWRpbmdXc1Byb2plY3QuSUxvYWRpbmdEdW1teTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRG9tTG9hZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldzRE9NUnVudGltZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5JV3NET01SdW50aW1lSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnJlZ2lzdHJ5LldzRE9NUnVudGltZVJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vblZpZXdlcjsNCi0NCi0vKiogDQotICogQ29udGVudCBwcm92aWRlciBmb3IgRE9NIHJlbGF0ZWQgb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXINCi17DQotCXByaXZhdGUgTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4gbG9hZExpc3RlbmVycyA9IG5ldyBIYXNoTWFwPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24sIElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsgDQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpDQotCXsNCi0JCXRoaXMoQ3VzdG9tRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5DQotCSAqLw0KLQlwdWJsaWMgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpDQotCXsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgY29udGV4dCkNCi0Jew0KLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKQ0KLQkJew0KLQkJCXJldHVybiBnZXRXc1Byb2plY3QoKElQcm9qZWN0KSgoSUFkYXB0YWJsZSkgY29udGV4dCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcykpOw0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIA0KLQkJew0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyAoKElMb2FkaW5nV3NQcm9qZWN0KWNvbnRleHQpLmlzTG9hZENhbmNlbGVkKCkgPyBuZXcgSUxvYWRpbmdDYW5jZWxlZCgpe30gOiBuZXcgSUxvYWRpbmdEdW1teSgpe30gfTsNCi0JCX0NCi0JCWVsc2UgaWYoY29udGV4dCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdeyBhZGFwdGVyRmFjdG9yeS5hZGFwdChjb250ZXh0LCBJU0VJQ2hpbGRMaXN0LmNsYXNzKSwNCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNvbnRleHQsIElXZWJTZXJ2aWNlQ2hpbGRMaXN0LmNsYXNzKSB9Ow0KLQkJfQ0KLQkJZWxzZSBpZihjb250ZXh0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJT2JqZWN0W10gd2ViU2VydmljZXMgPSAoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KWNvbnRleHQpLmdldFdTQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8d2ViU2VydmljZXMubGVuZ3RoOyBpaSsrKQ0KLQkJCXsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod2ViU2VydmljZXNbaWldLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCU9iamVjdFtdIHNFSXMgPSAoKElTRUlDaGlsZExpc3QpY29udGV4dCkuZ2V0U0VJQ2hpbGRMaXN0KCkudG9BcnJheSgpOw0KLQkJCQ0KLQkJCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzRUlzW2lpXSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCQl9DQotCQkJDQotCQkJcmV0dXJuIHNFSXM7DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9ICgoSVdlYlNlcnZpY2UpY29udGV4dCkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJaWYgKHNlaSA9PSBudWxsKSB7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQkJCX0NCi0JCQkNCi0JCQlhZGFwdGVyRmFjdG9yeS5hZGFwdChzZWksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXXsgc2VpIH07DQotCQl9DQotCQllbHNlIGlmKGNvbnRleHQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RNZXRob2RzKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSBjb250ZXh0KTsNCi0JCX0NCi0JCWVsc2UgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKSB7DQotCQkJcmV0dXJuIGV4dHJhY3RQYXJhbXMoKElXZWJNZXRob2QpY29udGV4dCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0V3NQcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIA0KLQl7DQotCQl0cnkgew0KLQkJCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSA9IGdldFN1cHBvcnRpbmdSdW50aW1lKHByb2plY3QpOw0KLQkJCWlmIChydW50aW1lID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07DQotCQkJfQ0KLQkJCQ0KLQkJCS8vIFdTIHByb2plY3QgaXMgbG9hZGVkIGFscmVhZHkNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gZ2V0V3NQcm9qZWN0KHJ1bnRpbWUuZ2V0RE9NKCksIHByb2plY3QpOyANCi0JCQlpZiAod3NQcm9qZWN0ICE9IG51bGwpDQotCQkJew0KLQkJCQlhZGFwdGVyRmFjdG9yeS5hZGFwdCh3c1Byb2plY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7DQotCQkJCXJldHVybiBuZXcgT2JqZWN0W10geyB3c1Byb2plY3QgfTsNCi0JCQl9DQotCQkJDQotCQkJYWRkUnVudGltZUxvYWRMaXN0ZW5lcihydW50aW1lKTsNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgZmFsc2UpIH07DQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsgLy8gJEpMLUVYQyQNCi0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExvYWRpbmdXc1Byb2plY3QocHJvamVjdCwgdHJ1ZSkgfTsgDQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NEb21Mb2FkTGlzdGVuZXIgYWRkUnVudGltZUxvYWRMaXN0ZW5lcihmaW5hbCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIHJ1bnRpbWUpIA0KLQl7DQotCQlJV3NEb21Mb2FkTGlzdGVuZXIgbG9hZExpc3RlbmVyID0gbG9hZExpc3RlbmVycy5nZXQocnVudGltZSk7IA0KLQkJaWYgKGxvYWRMaXN0ZW5lciE9bnVsbCkgew0KLQkJCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCQl9DQotCQkNCi0JCWxvYWRMaXN0ZW5lciA9IG5ldyBMb2FkTGlzdGVuZXIocnVudGltZSk7CQkNCi0JCWxvYWRMaXN0ZW5lcnMucHV0KHJ1bnRpbWUsIGxvYWRMaXN0ZW5lcik7CQkNCi0JCXJ1bnRpbWUuYWRkTG9hZExpc3RlbmVyKGxvYWRMaXN0ZW5lcik7DQotCQkNCi0JCXJldHVybiBsb2FkTGlzdGVuZXI7DQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0TWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgDQotCXsNCi0JCWZpbmFsIExpc3Q8SVdlYk1ldGhvZD4gd2ViTWV0aG9kcyA9IHNlaS5nZXRXZWJNZXRob2RzKCk7DQotCQlmb3IgKElXZWJNZXRob2Qgd2ViTWV0aG9kIDogd2ViTWV0aG9kcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYk1ldGhvZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHMudG9BcnJheSgpOwkJDQotCX0NCi0JDQotCXByb3RlY3RlZCBPYmplY3RbXSBleHRyYWN0UGFyYW1zKGZpbmFsIElXZWJNZXRob2QgbWV0aG9kKSANCi0Jew0KLQkJZmluYWwgTGlzdDxJV2ViUGFyYW0+IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7DQotCQlmb3IgKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHBhcmFtcykgew0KLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KHdlYlBhcmFtLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1zLnRvQXJyYXkoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KQ0KLQl7DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiAhKChJV2ViU2VydmljZUNoaWxkTGlzdCllbGVtZW50KS5nZXRXU0NoaWxkTGlzdCgpLmlzRW1wdHkoKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuICEoKElTRUlDaGlsZExpc3QpZWxlbWVudCkuZ2V0U0VJQ2hpbGRMaXN0KCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKSBlbGVtZW50KS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSAhPSBudWxsOyANCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAhKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWVsZW1lbnQpLmdldFdlYk1ldGhvZHMoKS5pc0VtcHR5KCk7DQotCQl9DQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQlyZXR1cm4gISgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJaWYgKGRvbSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA6IGRvbS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkgew0KLQkJCWlmKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3QuZ2V0TmFtZSgpKSkgew0KLQkJCQlyZXR1cm4gd3NQcm9qZWN0Ow0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGRvbVJ1bnRpbWVJbmZvcyA9IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKTsNCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gZmFjZXRzOw0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBkb21SdW50aW1lSW5mbyA6IGRvbVJ1bnRpbWVJbmZvcykgDQotCQl7DQotCQkJZmFjZXRzID0gZG9tUnVudGltZUluZm8uZ2V0UHJvamVjdEZhY2V0cygpOw0KLQkJCWlmIChoYXNGYWNldChmYWNldHMsIHByb2plY3QpKSB7DQotCQkJCXJldHVybiBnZXREb21SdW50aW1lKGRvbVJ1bnRpbWVJbmZvLmdldElkKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGYWNldChmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGZhY2V0cywgZmluYWwgSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJZm9yIChTdHJpbmcgZmFjZXRJZCA6IGZhY2V0cy5rZXlTZXQoKSkgDQotCQl7DQotCQkJaWYgKGZhY2V0SWQgPT0gbnVsbCB8fCBmYWNldHMuZ2V0KGZhY2V0SWQpID09IG51bGwpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCXRyeSB7DQotCQkJCWlmICgobmV3IEZhY2V0VXRpbHMoKSkuaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBmYWNldHMuZ2V0KGZhY2V0SWQpLCBmYWNldElkLCB0cnVlKSl7DQotCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJfQ0KLQkJCX0gDQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoU3RyaW5nIHJ1bnRpbWVJZCkgew0KLQkJcmV0dXJuIFdzRE9NUnVudGltZU1hbmFnZXIuaW5zdGFuY2UoKS5nZXRET01SdW50aW1lKHJ1bnRpbWVJZCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDbGFzcyB0aGF0IGlzIHVzZWQgdG8gbGlzdGVuIHdoZW4gdGhlIERPTSBsb2FkIHdpbGwgYmUgZmluaXNoZWQuIEFmdGVyIHRoZSBsb2FkIGhhcyBmaW5pc2hlZA0KLQkgKiB0aGlzIGNsYXNzIHRyYXZlcnNlcyB0aGUgcHJvamVjdCBleHBsb3JlcnMgdHJlZSBpbiBvcmRlciB0byBmaW5kIGFsbCBpbnN0YW5jZXMgb2YNCi0JICoge0BsaW5rIElMb2FkaW5nV3NQcm9qZWN0fSBhbmQgc3Vic3RpdHV0ZSB0aGVtIHdpdGggbG9hZGVkIHtAbGluayBJV2ViU2VydmljZVByb2plY3R9DQotCSAqIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9hZExpc3RlbmVyIGltcGxlbWVudHMgSVdzRG9tTG9hZExpc3RlbmVyDQotCXsNCi0JCXByaXZhdGUgZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lOw0KLQkJDQotCQlwdWJsaWMgTG9hZExpc3RlbmVyKGZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gcnVudGltZSkgDQotCQl7DQotCQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJ1bnRpbWUsICJydW50aW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQl0aGlzLnJ1bnRpbWUgPSBydW50aW1lOw0KLQkJfQ0KLQkJCQ0KLQkJcHVibGljIHZvaWQgZmluaXNoZWQoKSANCi0JCXsNCi0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkNCi0JCQl7DQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIA0KLQkJCQl7DQotCQkJCQlmaW5hbCBJVmlld1BhcnQgdmlld1BhcnQgPSBQcm9qZWN0RXhwbG9yZXJVdGlsLklOU1RBTkNFLmZpbmRQcm9qZWN0RXhwbG9yZXIoKTsNCi0JCQkJCWlmICh2aWV3UGFydCBpbnN0YW5jZW9mIENvbW1vbk5hdmlnYXRvcikgDQotCQkJCQl7DQotCQkJCQkJZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlciA9ICgoQ29tbW9uTmF2aWdhdG9yKXZpZXdQYXJ0KS5nZXRDb21tb25WaWV3ZXIoKTsNCi0JCQkJCQlmb3IgKFRyZWVJdGVtIGl0ZW0gOiBjb21tb25WaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCkpIHsNCi0JCQkJCQkJZXhjaGFuZ2VEdW1teShpdGVtLCBjb21tb25WaWV3ZXIpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfQkJDQotDQotCQlwcm90ZWN0ZWQgdm9pZCBleGNoYW5nZUR1bW15KGZpbmFsIFRyZWVJdGVtIHRyZWVJdGVtLCBmaW5hbCBDb21tb25WaWV3ZXIgY29tbW9uVmlld2VyKSANCi0JCXsNCi0JCQlpZiAodHJlZUl0ZW0gPT0gbnVsbCB8fCB0cmVlSXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlpZiAodHJlZUl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUxvYWRpbmdXc1Byb2plY3QpIHsNCi0JCQkJZXhjaGFuZ2VUcmVlSXRlbURhdGEodHJlZUl0ZW0sIGNvbW1vblZpZXdlcik7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlmb3IgKFRyZWVJdGVtIGNoaWxkIDogdHJlZUl0ZW0uZ2V0SXRlbXMoKSkgew0KLQkJCQkJZXhjaGFuZ2VEdW1teShjaGlsZCwgY29tbW9uVmlld2VyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXByaXZhdGUgdm9pZCBleGNoYW5nZVRyZWVJdGVtRGF0YShmaW5hbCBUcmVlSXRlbSB0cmVlSXRlbSwgZmluYWwgQ29tbW9uVmlld2VyIGNvbW1vblZpZXdlcikgDQotCQl7DQotCQkJZmluYWwgSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSAoSUxvYWRpbmdXc1Byb2plY3QpdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQkJCXRyeSB7DQotCQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgPSBnZXRXc1Byb2plY3QocnVudGltZS5nZXRET00oKSwgbG9hZGluZ1Byb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQkJYWRhcHRlckZhY3RvcnkuYWRhcHQod3NQcm9qZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKHdzUHJvamVjdCk7DQotDQotCQkJfSBjYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCQl0cmVlSXRlbS5zZXREYXRhKG5ldyBMb2FkaW5nV3NQcm9qZWN0KGxvYWRpbmdQcm9qZWN0LmdldFByb2plY3QoKSwgdHJ1ZSkpOw0KLQkJCX0NCi0JCQkNCi0JCQljb21tb25WaWV3ZXIucmVmcmVzaChsb2FkaW5nUHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBzdGFydGVkKCkgew0KLQkJCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGNsYXNzIExvYWRpbmdXc1Byb2plY3QgaW1wbGVtZW50cyBJTG9hZGluZ1dzUHJvamVjdA0KLQl7DQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0Ow0KLQkJZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkOw0KLQkJDQotCQlwdWJsaWMgTG9hZGluZ1dzUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzQ2FuY2VsZWQpIHsNCi0JCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvamVjdCwgInByb2plY3QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7DQotCQkJdGhpcy5pc0NhbmNlbGVkID0gaXNDYW5jZWxlZDsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7DQotCQkJcmV0dXJuIHByb2plY3Q7DQotCQl9DQotDQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRDYW5jZWxlZCgpIHsNCi0JCQlyZXR1cm4gaXNDYW5jZWxlZDsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTQ4NGU4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uaW50ZXJuYWwucGx1Z2luLkRvbUludGVncmF0aW9uUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0R1bW15Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSW1hZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRGVzY3JpcHRpb25Qcm92aWRlcjsNCi0NCi0vKioNCi0gKiBET00gYWRhcHRlciBmYWN0b3J5IHRoYXQgZXh0ZW5kcyB7QGxpbmsgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyfSBieSBwcm92aWRpbmcNCi0gKiBpY29ucyBhbmQgbGFiZWxzIGZvciBzb21lIG9iamVjdHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgRE9NIGFuZCBhbHNvIG92ZXJyaWRlcyBzb21lDQotICogbGFiZWxzDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSURlc2NyaXB0aW9uUHJvdmlkZXINCi17DQotCS8qKg0KLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yIHVzZXMge0BsaW5rIEN1c3RvbURvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5fSBhcyBkZWZhdWx0DQotCSAqIGFkYXB0ZXIgZmFjdG9yeSBwcm92aWRlZCB0byB0aGUgYmFzZSBjbGFzcy4NCi0JICovDQotCXB1YmxpYyBET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoKQ0KLQl7DQotCQlzdXBlcihDdXN0b21Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSk7DQotCQkNCi0JCURvbUludGVncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRMYWJlbFByb3ZpZGVyKHRoaXMpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfV0VCX1NFUlZJQ0VfR1JPVVApOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfU0VJX0dST1VQKTsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KSANCi0JCXsNCi0JCQlyZXR1cm4gSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfRE9NX1dTX1BST1ZJREVSKTsNCi0JCX0NCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0NhbmNlbGVkKSANCi0JCXsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9KYXhXc1dlYlNlcnZpY2VzTGFiZWw7IA0KLQkJfQ0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ0R1bW15KSANCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfTG9hZGluZ0R1bW15TGFiZWw7DQotCQl9DQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElMb2FkaW5nQ2FuY2VsZWQpIA0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9Mb2FkaW5nQ2FuY2VsZWRMYWJlbDsNCi0JCX0JCQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpDQotCXsNCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkNCi0JCXsNCi0JCQlyZXR1cm4gKChJV2ViU2VydmljZSllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJew0KLQkJCXJldHVybiAoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9hZGluZ1dzUHJvamVjdCkNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJfSmF4V3NXZWJTZXJ2aWNlc0xhYmVsOw0KLQkJfQ0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQl7DQotCQkJcmV0dXJuIERvbUludGVncmF0aW9uTWVzc2FnZXMuRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyX1dlYlNlcnZpY2VzTGFiZWw7DQotCQl9DQotCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcl9TZWlMYWJlbDsNCi0JCX0NCi0JCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElXZWJNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuICgoSVdlYk1ldGhvZCllbGVtZW50KS5nZXROYW1lKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoT2JqZWN0IGVsZW1lbnQpIA0KLQl7DQotCQlmb3IgKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGFiZWxQcm92aWRlckxpc3RlbmVyIDogbGFiZWxQcm92aWRlckxpc3RlbmVycykgew0KLQkJCWxhYmVsUHJvdmlkZXJMaXN0ZW5lci5sYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCh0aGlzLCBlbGVtZW50KSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVmYXVsdEltYWdlKE9iamVjdCBvYmplY3QpDQotCXsNCi0JCS8vIE5vIGRmYXVsdCBpbWFnZXMgDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9ET01JdGVtVmFsdWVQcm9wZXJ0eVNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQ0ZjYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTUl0ZW1WYWx1ZVByb3BlcnR5U291cmNlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSURPTVByb3BlcnR5VmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhhdCBjcmVhdGVzIGFkYXB0ZXIgZnJvbSB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9IHRvDQotICoge0BsaW5rIElQcm9wZXJ0eVNvdXJjZX0gaW50ZXJmYWNlLiBUaGlzIGZhY3RvcnkgaXMgcmVnaXN0ZXJlZCBpbiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMgZXh0ZW5zaW9uDQotICogcG9pbnQgYW5kIGlzIGNhbGxlZCB3aGVuIG9iamVjdCBvZiB0eXBlIHtAbGluayBJRE9NUHJvcGVydHlWYWx1ZX0gbmVlZHMgdG8gYmUNCi0gKiBkaXNwbGF5ZWQgb3IgZWRpdGVkIGluIHByb3BlcnR5IHNoZWV0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1AU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVZhbHVlUHJvcGVydHlTb3VyY2VGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IA0KLXsNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuQ2xhc3MpDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIA0KLQl7DQotCQlhc3NlcnQgYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSURPTVByb3BlcnR5VmFsdWU7DQotCQkNCi0JCWZpbmFsIElET01Qcm9wZXJ0eVZhbHVlIHdyYXBwZXIgPSAoSURPTVByb3BlcnR5VmFsdWUpYWRhcHRhYmxlT2JqZWN0Ow0KLQkJDQotCQlyZXR1cm4gbmV3IFByb3BlcnR5U291cmNlKHdyYXBwZXIuZ2V0RWRpdGFibGVWYWx1ZSgpLCB3cmFwcGVyKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpDQotCSAqLw0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsNCi0JCXJldHVybiBuZXcgQ2xhc3NbXSB7UHJvcGVydHlTb3VyY2UuY2xhc3N9Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2EzMzQzZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0RPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSANCi17DQotCXByaXZhdGUgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSANCi0Jew0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlLmlzSW5zdGFuY2UoYWRhcHRhYmxlT2JqZWN0KSkgDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIGFkYXB0YWJsZU9iamVjdDsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGFkYXB0ZXJUeXBlID09IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLmNsYXNzKSANCi0gICAgICAgIHsNCi0gICAgICAgIAlyZXR1cm4gZ2V0QWRhcHRlckZhY3RvcnkoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgDQotCXsNCi0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NbXSB7DQotICAgICAgICAJCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmNsYXNzLA0KLSAgICAgICAgfTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXJGYWN0b3J5KCkNCi0Jew0KLQkJaWYgKGFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsNCi0JCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JTG9hZGluZ1dzUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNjJlYWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSUxvYWRpbmdXc1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEFuIGludGVyZmFjZSBwcmVzZW50aW5nIG5vdCBsb2FkZWQgd2ViIHNlcnZpY2UgcHJvamVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCANCi0gKiB0byBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBleHBsb3JlciBXUyB0cmVlIGluIGNhc2VzIHdoZW4gdGhlIHByb2plY3QgaXMgcmVsZXZhbnQgDQotICogYnV0IGl0IGlzIG5vdCB5ZXQgbG9hZGVkIGJ5IERPTSBsb2FkZXIuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElMb2FkaW5nV3NQcm9qZWN0IA0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHJlbGV2YW50IHByb2plY3QNCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCk7DQotCQ0KLQkvKioNCi0JICogQHJldHVybiBpZiB0aGUgRE9NIGxvYWRpbmcgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCk7DQotCQ0KLQkvKioNCi0JICogSW50ZXJmYWNlIHVzZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHRyZWUgYXMgYSBzdWIgbm9kZSBvZiBJTm90TG9hZGVkV3NQcm9qZWN0IG5vZGUNCi0JICogYW5kIGRpc3BsYXllZCB3aXRoIHRleHQgIkxvYWRpbmcuLi4iLg0KLQkgKiANCi0JICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLQkgKi8NCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0R1bW15IHt9Ow0KLQkNCi0JcHVibGljIGludGVyZmFjZSBJTG9hZGluZ0NhbmNlbGVkIHt9Ow0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lTRUlDaGlsZExpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNGY2YjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvSVNFSUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotcHVibGljIGludGVyZmFjZSBJU0VJQ2hpbGRMaXN0IGV4dGVuZHMgQWRhcHRlcg0KLXsNCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNFSUNoaWxkTGlzdCgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL0lXZWJTZXJ2aWNlQ2hpbGRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk2MzgxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9JV2ViU2VydmljZUNoaWxkTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdlYlNlcnZpY2VDaGlsZExpc3QgZXh0ZW5kcyBBZGFwdGVyDQotew0KLQlwdWJsaWMgRUxpc3Q8SVdlYlNlcnZpY2U+IGdldFdTQ2hpbGRMaXN0KCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL1dlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2OWE3N2Y2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi9uYXZpZ2F0b3IvV2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Eb21VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwuRG9tMlJlc291cmNlTWFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJU19ERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvciI7IAotCQotCS8qKgotCSAqIFRoZSBBUFQgbWFya2VyIElEcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFRfTUFSS0VSX0lEID0gQXB0UGx1Z2luLkFQVF9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBUX05PTlJFQ09OQ0lMRV9NQVJLRVJfSUQgPSBBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUjsKLQkKLQkvKiogRW51bSB0byByZXByZXNlbnQgZGlmZmVyZW50IG1hcmtlciB0eXBlcyAqLwotCXB1YmxpYyBlbnVtIFNldmVyaXR5IHtPSywgRVJST1IsIFdBUk5JTkd9OwotCQotCXByaXZhdGUgRG9tVXRpbCBkb21VdGlsID0gRG9tVXRpbC5JTlNUQU5DRTsKLQlwcml2YXRlIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBkb20yUmVzb3VyY2VNYXBwZXIgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0U7Ci0JCi0JcHVibGljIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcigpCi0JewotCQlhZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIGxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpCi0JCQl7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpCi0JCQkJewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKQotCQkJCQl7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS51cGRhdGUoVEhJU19ERUNPUkFUT1JfSUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKSAKLQl7Ci0JCWZpbmFsIFNldmVyaXR5IHNldmVyaXR5ID0gZGVmaW5lU2V2ZXJpdHkob2JqKTsJCQotCQlpZiAoc2V2ZXJpdHkgPT0gU2V2ZXJpdHkuRVJST1IpIHsKLQkJCXJldHVybiBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUjsKLQkJfSAKLQkJCi0JCWlmIChzZXZlcml0eSA9PSBTZXZlcml0eS5XQVJOSU5HKSB7Ci0JCQlyZXR1cm4gSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuV0FSTklORzsKLQkJfQotCi0JCXJldHVybiAwOwotCX0JCi0KLQkvKioKLQkgKiBDaGVja3MgdGhlIG9iamVjdCdzIHJlc291cmNlIGZvciBtYXJrZXJzIGFuZCBkZWZpbmVzIHRoZSBzZXZlcml0eSBvZiB0aGUKLQkgKiBwcm9ibGVtIGlmIGFueS4gCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIHNldmVyaXR5IGNhbGN1bGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIE9iamVjdCBvYmopIAotCXsKLQkJdHJ5IAotCQl7Ci0JCQkvLyBwcm9jZXNzIGFkZGl0aW9uYWwgRE9NIG9iamVjdHMgbmVlZGVkIGZvciBVSSAtIElXZWJTZXJ2aWNlQ2hpbGRMaXN0IGFuZCBJU0VJQ2hpbGRMaXN0Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpIHsKLQkJCQlyZXR1cm4gZGVmaW5lU2V2ZXJpdHlGb3JFTGlzdCgoKElXZWJTZXJ2aWNlQ2hpbGRMaXN0KW9iaikuZ2V0V1NDaGlsZExpc3QoKSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KSB7Ci0JCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5Rm9yRUxpc3QoKChJU0VJQ2hpbGRMaXN0KW9iaikuZ2V0U0VJQ2hpbGRMaXN0KCkpOwotCQkJfQotCQkJCi0JCQkvLyBkbyBub3QgcHJvY2VzcyBub24gRE9NIG9iamVjdHMKLQkJCWlmKCAhKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpICkgewotCQkJCXJldHVybiBTZXZlcml0eS5PSzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KChFT2JqZWN0KSBvYmopOwotCQl9IAotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gU2V2ZXJpdHkuT0s7Ci0JfQotCQotCXByb3RlY3RlZCBTZXZlcml0eSBkZWZpbmVTZXZlcml0eUZvckVMaXN0KGZpbmFsIExpc3Q8PyBleHRlbmRzIEVPYmplY3Q+IGxpc3QpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlTZXZlcml0eSBzZXZlcml0eSA9IFNldmVyaXR5Lk9LOwkJCi0JCWZvciAoRU9iamVjdCBlT2JqZWN0IDogbGlzdCkgCi0JCXsKLQkJCVNldmVyaXR5IHRlbXBTZXZlcml0eSA9IGRlZmluZVNldmVyaXR5KGVPYmplY3QpOwotCQkJaWYgKHRlbXBTZXZlcml0eSA9PSBTZXZlcml0eS5FUlJPUikgewotCQkJCXJldHVybiBTZXZlcml0eS5FUlJPUjsKLQkJCX0KLQkJCQotCQkJaWYgKHRlbXBTZXZlcml0eT09U2V2ZXJpdHkuV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V2ZXJpdHkgZGVmaW5lU2V2ZXJpdHkoZmluYWwgRU9iamVjdCBlT2JqZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQl7IAkJCi0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kUmVzb3VyY2UoZU9iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSE9bnVsbCkgewotCQkJcmV0dXJuIGRlZmluZVNldmVyaXR5KGVPYmplY3QsIHJlc291cmNlKTsKLQkJfQotCQkKLQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCX0KLQkJCi0JcHJvdGVjdGVkIFNldmVyaXR5IGRlZmluZVNldmVyaXR5KGZpbmFsIEVPYmplY3QgZU9iamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIFNldmVyaXR5Lk9LOwotCQl9Ci0JCQotCQlmaW5hbCBpbnQgZGVwdGggPSAocmVzb3VyY2UuZ2V0VHlwZSgpPT1JUmVzb3VyY2UuUFJPSkVDVCkgPyBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUgOiBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQkJZmluYWwgQ29sbGVjdGlvbjxJTWFya2VyPiBtYXJrZXJzID0gZmluZEFwdE1hcmtlcnMocmVzb3VyY2UsIGRlcHRoKTsKLQkJU2V2ZXJpdHkgc2V2ZXJpdHkgPSBTZXZlcml0eS5PSzsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIAotCQl7Ci0JCQlpZiAoIWlzUmVsZXZhbnRGb3IoZU9iamVjdCwgbWFya2VyKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpbnQgdGVtcFNldmVyaXR5ID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsKLQkJCWlmICh0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpIHsKLQkJCQlyZXR1cm4gU2V2ZXJpdHkuRVJST1I7Ci0JCQl9IAotCi0JCQlpZih0ZW1wU2V2ZXJpdHk9PUlNYXJrZXIuU0VWRVJJVFlfV0FSTklORykgewotCQkJCXNldmVyaXR5ID0gU2V2ZXJpdHkuV0FSTklORzsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHNldmVyaXR5ID09IFNldmVyaXR5Lk9LICYmIChlT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpKSAKLQkJewotCQkJLy8gZm9yIGJlYW4gd2l0aCBleHBsaWNpdCBpbnRlcmZhY2Ugd2UgbmVlZCB0byBjaGVjayB0aGUgaW50ZXJmYWNlIGFzIHdlbGwgCi0JCQkvLyBiZWNhdXNlIGl0IHJlc2lkZXMgaW4gYW5vdGhlciByZXNvdXJjZQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSAoKElXZWJTZXJ2aWNlKWVPYmplY3QpLmdldFNlcnZpY2VFbmRwb2ludCgpOwotCQkJaWYgKHNlaSAhPSBudWxsICYmICFzZWkuaXNJbXBsaWNpdCgpKSB7Ci0JCQkJc2V2ZXJpdHkgPSBkZWZpbmVTZXZlcml0eShzZWkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT5lT2JqZWN0PC9jb2RlPi4KLQkgKiBPbmx5IGZvciB3ZWIgbWV0aG9kIGFuZCB3ZWIgcGFyYW1ldGVyIHdlIG5lZWQgdG8gZGVmaW5lIGlmIHRoZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1bmlxdWUgaW4gdGhlIHNjb3BlIG9mIHRoZSByZXNvdXJjZS4gRm9yIGV4YW1wbGUgaWYgdGhlcmUgaXMgYQotCSAqIG1hcmtlciBzZXQgb24gdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgU0VJLCB0aGUgU0VJIHNob3VsZCBiZSBtYXJrZWQgaW4gYW55IGNhc2UgCi0JICogd2hpbGUgdGhlIG1ldGhvZCBvbmx5IGluIGNhc2Ugd2hlbiB0aGUgZXJyb3IgaXMgc3BlY2lmaWNhbGx5IGZvciB0aGlzIG1ldGhvZCBvciAKLQkgKiBtZXRob2QgcGFyYW1ldGVyLiAKLQkgKiBAcGFyYW0gZU9iamVjdCB0aGUgb2JqZWN0IHRvIGJlIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBtYXJrZXIgdGhlIHJlc291cmNlIG1hcmtlciAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgPGNvZGU+ZU9iamVjdDwvY29kZT4gCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvcihmaW5hbCBFT2JqZWN0IGVPYmplY3QsIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJc3dpdGNoIChlT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRDoKLQkJCXJldHVybiBpc1JlbGV2YW50Rm9yTWV0aG9kKChJV2ViTWV0aG9kKWVPYmplY3QsIG1hcmtlcik7Ci0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgotCQkJcmV0dXJuIGlzUmVsZXZhbnRGb3JQYXJhbWV0ZXIoKElXZWJQYXJhbSllT2JqZWN0LCBtYXJrZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogRGVmaW5lcyBpZiA8Y29kZT5tYXJrZXI8L2NvZGU+IGlzIHJlbGV2YW50IGZvciA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+LgotCSAqIENoZWNrcyBpZiB0aGUgbWFya2VyIGlzIHNwZWNpZmljYWxseSBmb3IgdGhpcyBtZXRob2Qgb3Igc29tZSBvZiBpdCdzIHBhcmFtZXRlcnMuCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gbWFya2VyIHRoZSBtYXJrZXIgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBtYXJrZXIgaXMgcmVsZXZhbnQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvck1ldGhvZChmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJVHlwZSB0eXBlID0gZG9tMlJlc291cmNlTWFwcGVyLmZpbmRUeXBlKHdlYk1ldGhvZCk7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCB3ZWJNZXRob2QpOwotCQlmaW5hbCBJQW5ub3RhdGlvbkluc3BlY3RvciBhbm5vdGF0aW9uSW5zcGVjdG9yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKTsKLQkJYm9vbGVhbiByZWxldmFudCA9IGlzTWFya2VyUmVsZXZhbnRGb3IoamF2YU1ldGhvZCwgbWFya2VyLCBhbm5vdGF0aW9uSW5zcGVjdG9yKTsKLQkJaWYgKCFyZWxldmFudCkKLQkJewotCQkJZm9yIChTdHJpbmcgbWV0aG9kUGFyYW1ldGVyTmFtZSA6IGphdmFNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSkKLQkJCXsKLQkJCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBwYXJhbSA9IGphdmFNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihtZXRob2RQYXJhbWV0ZXJOYW1lKTsKLQkJCQlyZWxldmFudCA9IHJlbGV2YW50IHx8IGlzTWFya2VyUmVsZXZhbnRGb3IocGFyYW0sIG1hcmtlciwgYW5ub3RhdGlvbkluc3BlY3Rvcik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVsZXZhbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWxldmFudEZvclBhcmFtZXRlcihmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVR5cGUgdHlwZSA9IGRvbTJSZXNvdXJjZU1hcHBlci5maW5kVHlwZSh3ZWJQYXJhbSk7Ci0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIgPSBmaW5kSmF2YVBhcmFtZXRlcih0eXBlLCB3ZWJQYXJhbSk7Ci0JCXJldHVybiBpc01hcmtlclJlbGV2YW50Rm9yKGphdmFQYXJhbWV0ZXIsIG1hcmtlciwgQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIHtAbGluayBJVHlwZVBhcmFtZXRlcn0gaW5zdGFuY2Ugd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHdlYiBwYXJhbWV0ZXIgc3BlY2lmaWVkCi0JICovCi0JcHJpdmF0ZSBJVHlwZVBhcmFtZXRlciBmaW5kSmF2YVBhcmFtZXRlcihmaW5hbCBJVHlwZSB0eXBlLCBmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElNZXRob2QgamF2YU1ldGhvZCA9IGRvbVV0aWwuZmluZE1ldGhvZCh0eXBlLCAoSVdlYk1ldGhvZCkgd2ViUGFyYW0uZUNvbnRhaW5lcigpKTsKLQkJZm9yIChTdHJpbmcgcGFyYW1OYW1lIDogamF2YU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpKQotCQl7Ci0JCQlmaW5hbCBJVHlwZVBhcmFtZXRlciBqYXZhUGFyYW0gPSBqYXZhTWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsKLQkJCWlmICh3ZWJQYXJhbS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhqYXZhUGFyYW0uZ2V0RWxlbWVudE5hbWUoKSkpCi0JCQl7Ci0JCQkJcmV0dXJuIGphdmFQYXJhbTsKLQkJCX0KLQkJfQotCi0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlBhcmFtZXRlciAiICsgd2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSArICIgbm90IGZvdW5kIik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWFya2VyUmVsZXZhbnRGb3IoZmluYWwgSU1ldGhvZCBqYXZhTWV0aG9kLCBmaW5hbCBJTWFya2VyIG1hcmtlciwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZm9yIChJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm4gOiBpbnNwZWN0b3IuaW5zcGVjdE1ldGhvZChqYXZhTWV0aG9kKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50Rm9yKGZpbmFsIElUeXBlUGFyYW1ldGVyIHBhcmFtZXRlciwgZmluYWwgSU1hcmtlciBtYXJrZXIsIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubiA6IGluc3BlY3Rvci5pbnNwZWN0UGFyYW0ocGFyYW1ldGVyKSkKLQkJewotCQkJaWYgKGlzTWFya2VyUmVsZXZhbnRUb0Fubm90YXRpb24obWFya2VyLCBhbm4pKQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBpcyByZWxldmFudCBmb3IgdGhlIGFubm90YXRpb24gc3BlY2lmaWVkPGJyPgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCByZWFkIGFsbCB0aGUgYW5ub3RhdGlvbnMgcmVsZXZhbnQgZm9yIHRoZSBqYXZhIGVsZW1lbnQgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIG1hcmtlciBzdGFydC9lbmQgcG9zaXRpb24gaXMgYmV0d2VlbiBhbm5vdGF0aW9uIHN0YXJ0L2VuZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01hcmtlclJlbGV2YW50VG9Bbm5vdGF0aW9uKGZpbmFsIElNYXJrZXIgbWFya2VyLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm4pIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBpbnQgYW5uU3RhcnRQb3MgPSBhbm4uZ2V0TG9jYXRvcigpLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJZmluYWwgaW50IGFubkVuZFBvcyA9IGFublN0YXJ0UG9zICsgYW5uLmdldExvY2F0b3IoKS5nZXRMZW5ndGgoKSAtIDE7Ci0JCXJldHVybiAoYW5uU3RhcnRQb3MgPD0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJUKSkgJiYgKGFubkVuZFBvcyA+PSAoSW50ZWdlcikgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5EKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYWxsIEFQVCBub25yZWNvbmNpbGUgbWFya2VycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIHNwZWNpZmllZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxJTWFya2VyPiBmaW5kQXB0TWFya2VycyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIGludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIENvbGxlY3Rpb248SU1hcmtlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJTWFya2VyPigpOwotCQkvLyBTZWFyY2ggZm9yIGJvdGggQVBUIG1hcmtlciB0eXBlcy4gT25lIG9mIGVhY2ggSURzIGlzIHVzZWQgb24gTGludXggYW5kIFdpbmRvd3MKLQkJZm9yKGZpbmFsIElNYXJrZXIgbSA6IHJlc291cmNlLmZpbmRNYXJrZXJzKEFQVF9NQVJLRVJfSUQsIGZhbHNlLCBkZXB0aCkpCi0JCXsKLQkJCXJlc3VsdC5hZGQobSk7Ci0JCX0KLQkJCi0JCWZvcihmaW5hbCBJTWFya2VyIG0gOiByZXNvdXJjZS5maW5kTWFya2VycyhBUFRfTk9OUkVDT05DSUxFX01BUktFUl9JRCwgZmFsc2UsIGRlcHRoKSkKLQkJewotCQkJcmVzdWx0LmFkZChtKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvTmF2aWdhdGVUb0ltcGxlbWVudGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiZjEzNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL05hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlByb2plY3RNYW5hZ2VtZW50VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbg0KLQkJaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsNCi0JcHJvdGVjdGVkIE9iamVjdCBzcmNPYmplY3Q7DQotDQotCXByaXZhdGUgSUphdmFQcm9qZWN0IHByb2plY3Q7DQotDQotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsNCi0JCXRoaXMoRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5PcGVuV1NSZXNvdXJjZUFjdGlvbl9OYW1lKTsNCi0NCi0JCXRoaXMudmlld2VyID0gdmlld2VyOw0KLQl9DQotDQotCXByb3RlY3RlZCBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsNCi0JCXN1cGVyKHRleHQpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKQ0KLQl7DQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikNCi0JCXsNCi0JCQlyZXR1cm4gRG9tSW50ZWdyYXRpb25NZXNzYWdlcy5OYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb25fU2hvd0luV2ViU2VydmljZXNBcmVhQWN0aW9uOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiBEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbl9TaG93SW5FSkJBcmVhQWN0aW9uOw0KLQkJfQ0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgew0KLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBzdXBlci5pc0VuYWJsZWQoKSANCi0JCSYmIHRoaXMudmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcg0KLQkJJiYgdGhpcy5wcm9qZWN0ICE9bnVsbA0KLQkJJiYgUHJvamVjdE1hbmFnZW1lbnRVdGlscy5pc0VqYjNQcm9qZWN0KHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pDQotCQl7DQotCQkJU2Vzc2lvbkJlYW4gc2Vzc2lvbkJlYW4gPSAoKFNlc3Npb25CZWFuKXNyY09iamVjdCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JCQkJJiYgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNyY09iamVjdCkuaXNJbXBsaWNpdCgpKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWINCi0JCXJ1bigpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gbnVsbDsNCi0NCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKQ0KLQkJew0KLQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKChTZXNzaW9uQmVhbilzcmNPYmplY3QpOw0KLQkJCVN0cmluZyBlamJDbGFzcyA9IHNlc3Npb25CZWFuLmdldEVqYkNsYXNzKCk7DQotCQkJSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IGdldFdlYlNlcnZpY2Uoc2Vzc2lvbkJlYW4pOw0KLQkJCWlmICh3ZWJTZXJ2aWNlID09IG51bGwpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJID0gd2ViU2VydmljZS5nZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQlib29sZWFuIGlzSW1wbGljaXQgPSBzRUkuaXNJbXBsaWNpdCgpOw0KLQkJCVN0cmluZyBzRUlDbGFzczsNCi0JCQlpZiAoIWlzSW1wbGljaXQpew0KLQkJCQlTdHJpbmcgaW1wbCA9IHNFSS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCQlzRUlDbGFzcyA9IGltcGw7DQotCQkJfSBlbHNlIHsNCi0JCQkJc0VJQ2xhc3MgPSBlamJDbGFzczsNCi0JCQl9DQotICAgICAgICAgICAgdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKHNFSUNsYXNzKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCQkJbW92ZVRvU0VJTm9kZShyZXNvdXJjZSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJyZWQiLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybjsNCi0JCQl9DQotICAgICAgICAgICAgDQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY3UgPSBwcm9qZWN0LmZpbmRUeXBlKA0KLQkJCQkJCSgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCkgc3JjT2JqZWN0KQ0KLQkJCQkJCQkJLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsNCi0JCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkIiwgam1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCW1vdmVUb0VqYk5vZGUoY3UuZ2V0UmVzb3VyY2UoKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgSVdlYlNlcnZpY2UgaWYgc2Vzc2lvbkJlYW4gaGFzIGJlZW4gZXhwb3NlZCBhcyB3ZWIgc2VydmljZS4NCi0JICogQHBhcmFtIHNlc3Npb25CZWFuIGEgc2Vzc2lvbiBiZWFuLg0KLQkgKiBAcmV0dXJuIElXZWJTZXJ2aWNlIGlmIHNlc3Npb25CZWFuIGhhcyBiZWVuIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UuIElmIHRoZSBzZXNzaW9uIGJlYW4gaGFzIG5vdCBiZWVuDQotCSAqIGV4cG9zZWQgYXMgd2ViIHNlcnZpY2UgLSByZXR1cm5zIG51bGwuDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgc2Vzc2lvbkJlYW4gaXMgbnVsbC4NCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXZWJTZXJ2aWNlKGZpbmFsIFNlc3Npb25CZWFuIHNlc3Npb25CZWFuKSANCi0Jew0KLQkJZmluYWwgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZ2V0RG9tUnVudGltZSgpOw0KLQkJaWYgKGRvbVJ1bnRpbWUgPT0gbnVsbCkgew0KLQkJICAgICAgcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQl0cnkgew0KLQkJCWZpbmFsIElET00gZG9tID0gZG9tUnVudGltZS5nZXRET00oKTsNCi0JCQlpZiAoZG9tID09IG51bGwpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3ZWJTZXJ2aWNlUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoZG9tLCB0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CQkNCi0JCQlyZXR1cm4gRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NCeUltcGxOYW1lKHdlYlNlcnZpY2VQcm9qZWN0LCBzZXNzaW9uQmVhbi5nZXRFamJDbGFzcygpKTsNCi0JCX0gDQotCQljYXRjaCAoV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gZSkgeyAvLyAkSkwtRVhDJA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERvbVJ1bnRpbWUoKSB7DQotCQlyZXR1cm4gV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmdldERPTVJ1bnRpbWUoSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5JRCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb1NFSU5vZGUoSVJlc291cmNlIHJlc291cmNlKQ0KLQl7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VQcm9qZWN0KSB7DQotCQkJCXdzUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpIHByb2plY3RFbGVtZW50c1tpaV07DQotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCh3c1Byb2plY3QsIDIpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc0VJIDogd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQl0cnkgew0KLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcHJvamVjdC5maW5kVHlwZSgNCi0JCQkJCQkoKElKYXZhV2ViU2VydmljZUVsZW1lbnQpIHNFSSkNCi0JCQkJCQkJCS5nZXRJbXBsZW1lbnRhdGlvbigpKS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJDQotCQkJCWlmKGN1LmdldFJlc291cmNlKCkuZXF1YWxzKHJlc291cmNlKSkNCi0JCQkJew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc0VJKTsNCi0JCQkJCVRyZWVQYXRoIHRyZWVQYXRoID0gZ2V0VHJlZVBhdGhGb3JTRUkodHJlZVZpZXdlciwNCi0JCQkJCQkJd3NQcm9qZWN0KTsNCi0JCQkJCU9iamVjdFtdIGVsZW1lbnRzVG9FeHBhbmQgPSBuZXcgT2JqZWN0W3RyZWVQYXRoDQotCQkJCQkJCS5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQkJCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCQkJCQlpZiAobm90QWxyZWFkeUV4cGFuZGVkKHRyZWVQYXRoLmdldFNlZ21lbnQoamopLA0KLQkJCQkJCQkJZXhwYW5kZWRPYmplY3RzKSkgew0KLQkJCQkJCQllbGVtZW50c1RvRXhwYW5kW2pqXSA9IHRyZWVQYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCWZvciAoaW50IGpqID0gMDsgamogPCBlbGVtZW50c1RvRXhwYW5kLmxlbmd0aDsgamorKykgew0KLQkJCQkJCWlmIChlbGVtZW50c1RvRXhwYW5kW2pqXSAhPSBudWxsKSB7DQotCQkJCQkJCU9iamVjdFtdIHRtcCA9IGV4cGFuZGVkT2JqZWN0czsNCi0JCQkJCQkJZXhwYW5kZWRPYmplY3RzID0gbmV3IE9iamVjdFtleHBhbmRlZE9iamVjdHMubGVuZ3RoICsgMV07DQotDQotCQkJCQkJCWZvciAoaW50IGtrID0gMDsga2sgPCB0bXAubGVuZ3RoOyBraysrKSB7DQotCQkJCQkJCQlleHBhbmRlZE9iamVjdHNba2tdID0gdG1wW2trXTsNCi0JCQkJCQkJfQ0KLQ0KLQkJCQkJCQlleHBhbmRlZE9iamVjdHNbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCAtIDFdID0gZWxlbWVudHNUb0V4cGFuZFtqal07DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBvY2N1cnJlZCIsIGptZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCX0NCi0JCSBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKHRyZWVWaWV3ZXIsIGV4cGFuZGVkT2JqZWN0cywgc2VsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0VqYk5vZGUoSVJlc291cmNlIHJlc291cmNlKSB7DQotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSAoVHJlZVZpZXdlcil0aGlzLnZpZXdlcjsNCi0JCUlTZWxlY3Rpb24gc2VsID0gbnVsbDsNCi0NCi0JCU9iamVjdFtdIGV4cGFuZGVkT2JqZWN0cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOw0KLQ0KLQkJT2JqZWN0W10gcHJvamVjdEVsZW1lbnRzID0gKChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcg0KLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldENoaWxkcmVuKHRoaXMucHJvamVjdC5nZXRQcm9qZWN0KCkpOw0KLQkJR3JvdXBFSkJQcm92aWRlciBlamJQcm92aWRlciA9IG51bGw7DQotCQlHcm91cEVqYlNlc3Npb24gZWpiU2Vzc2lvbiA9IG51bGw7DQotDQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgcHJvamVjdEVsZW1lbnRzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChwcm9qZWN0RWxlbWVudHNbaWldIGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgew0KLQkJCQllamJQcm92aWRlciA9IChHcm91cEVKQlByb3ZpZGVyKSBwcm9qZWN0RWxlbWVudHNbaWldOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiUHJvdmlkZXIsIDEpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoZWpiUHJvdmlkZXIgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQlmb3IgKE9iamVjdCBlamJQcm92aWRlckNoaWxkIDogZWpiUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSkgew0KLQkJCWlmIChlamJQcm92aWRlckNoaWxkIGluc3RhbmNlb2YgR3JvdXBFamJTZXNzaW9uKSB7DQotCQkJCWVqYlNlc3Npb24gPSAoR3JvdXBFamJTZXNzaW9uKSBlamJQcm92aWRlckNoaWxkOw0KLQkJCQl0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoZWpiU2Vzc2lvbiwgMik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGVqYlNlc3Npb24gPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCU9iamVjdFtdIGVqYnMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsNCi0NCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBlamJzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmICgoZWpic1tpaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil8fChlamJzW2lpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSkgew0KLQkJCQ0KLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBmaW5kSmF2YVByb2plY3QoZWpic1tpaV0pOw0KLQkJCQlJVHlwZSB0ID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWlmKChlamJzW2lpXSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSkNCi0JCQkJCQl0ID0gamF2YVByb2plY3QuZmluZFR5cGUoKChTZXNzaW9uQmVhbillamJzW2lpXSkuZ2V0RWpiQ2xhc3MoKSk7DQotCQkJCQllbHNlDQotCQkJCQkJdCA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKCgoTWVzc2FnZURyaXZlbkJlYW4pZWpic1tpaV0pLmdldEVqYkNsYXNzKCkpOw0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJCUlSZXNvdXJjZSByID0gdC5nZXRSZXNvdXJjZSgpOw0KLQkJCQkNCi0JCQkJaWYgKHIuZXF1YWxzKHJlc291cmNlKSkgew0KLQkJCQkJc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWpic1tpaV0pOw0KLQkJCQkJVHJlZVBhdGggdHJlZVBhdGggPSBnZXRUcmVlUGF0aEZvck9iamVjdCh0cmVlVmlld2VyLA0KLQkJCQkJCQllamJzW2lpXSk7DQotCQkJCQlleHBhbmRFbGVtZW50cyhleHBhbmRlZE9iamVjdHMsIHRyZWVQYXRoKTsNCi0NCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJIHNldEV4cGFuZGVkRWxlbWVudHNBbmRTZWxlY3Rpb24odHJlZVZpZXdlciwgZXhwYW5kZWRPYmplY3RzLCBzZWwpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGZpbmRKYXZhUHJvamVjdChPYmplY3QgZWpiKQ0KLQl7DQotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGVqYik7DQotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZEVsZW1lbnRzQW5kU2VsZWN0aW9uKFRyZWVWaWV3ZXIgdHJlZVZpZXdlciwgT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBJU2VsZWN0aW9uIHNlbCkNCi0Jew0KLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkT2JqZWN0cyk7DQotDQotCQlpZiAoc2VsICE9IG51bGwpIHsNCi0JCQl0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWwsIHRydWUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgZXhwYW5kRWxlbWVudHMoT2JqZWN0W10gZXhwYW5kZWRPYmplY3RzLCBUcmVlUGF0aCB0cmVlUGF0aCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBlbGVtZW50c1RvRXhwYW5kID0gbmV3IE9iamVjdFt0cmVlUGF0aC5nZXRTZWdtZW50Q291bnQoKV07DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIA0KLQkJew0KLQkJCWlmIChub3RBbHJlYWR5RXhwYW5kZWQodHJlZVBhdGguZ2V0U2VnbWVudChqaiksIGV4cGFuZGVkT2JqZWN0cykpIA0KLQkJCXsNCi0JCQkJZWxlbWVudHNUb0V4cGFuZFtqal0gPSB0cmVlUGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQl9DQotCQl9DQotDQotCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgZWxlbWVudHNUb0V4cGFuZC5sZW5ndGg7IGpqKyspIHsNCi0JCSAgICBpZiAoZWxlbWVudHNUb0V4cGFuZFtqal0gIT0gbnVsbCkgew0KLQkJICAgIAlPYmplY3RbXSB0bXAgPSBleHBhbmRlZE9iamVjdHM7DQotCQkgICAgICAgIGV4cGFuZGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbZXhwYW5kZWRPYmplY3RzLmxlbmd0aCArIDFdOw0KLQ0KLQkJCQlmb3IgKGludCBrayA9IDA7IGtrIDwgdG1wLmxlbmd0aDsga2srKykgew0KLQkJCQkJZXhwYW5kZWRPYmplY3RzW2trXSA9IHRtcFtra107DQotCQkJCX0NCi0NCi0JCQkJZXhwYW5kZWRPYmplY3RzW2V4cGFuZGVkT2JqZWN0cy5sZW5ndGggLSAxXSA9IGVsZW1lbnRzVG9FeHBhbmRbampdOw0KLQkJICAgIH0NCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gbm90QWxyZWFkeUV4cGFuZGVkKE9iamVjdCBvYmosIE9iamVjdFtdIGV4cE9ianMpIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBleHBPYmpzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChleHBPYmpzW2lpXS5lcXVhbHMob2JqKSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvclNFSShUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QpDQotCXsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdA0KLQkJCQkJJiYgY29udGFpbnModHJlZVBhdGhzW2lpXSwgd3NQcm9qZWN0KSkgew0KLQkJCQlyZXR1cm4gdHJlZVBhdGhzW2lpXTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFRyZWVQYXRoIHRyZWVQYXRoLCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlmb3IoaW50IGlpPTA7IGlpPHRyZWVQYXRoLmdldFNlZ21lbnRDb3VudCgpOyBpaSsrKQ0KLQkJew0KLQkJCWlmKHRyZWVQYXRoLmdldFNlZ21lbnQoaWkpLmVxdWFscyh3c1Byb2plY3QpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHJpdmF0ZSBUcmVlUGF0aCBnZXRUcmVlUGF0aEZvck9iamVjdChUcmVlVmlld2VyIHRyZWVWaWV3ZXIsIE9iamVjdCBvYmopIHsNCi0JCVRyZWVQYXRoW10gdHJlZVBhdGhzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOw0KLQ0KLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHRyZWVQYXRocy5sZW5ndGg7IGlpKyspIHsNCi0JCQlpZiAodHJlZVBhdGhzW2lpXS5nZXRMYXN0U2VnbWVudCgpLmVxdWFscyhvYmopKSB7DQotCQkJCXJldHVybiB0cmVlUGF0aHNbaWldOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sDQotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsNCi0JCS8vIFRPRE8gSEFDSyENCi0JCXVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwNCi0JCQlJSmF2YVByb2plY3QgcHJvamVjdCkgew0KLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOw0KLQ0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN0cnVjdHVyZWQgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkIGluIHRoZSB3b3JrYmVuY2guIFN1YmNsYXNzZXMgc2hvdWxkDQotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uDQotCSAqIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kIGZhbHNlIG90aGVyd2lzZS4NCi0JICogDQotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLg0KLQkgKiBJZiB0aGUgc3VwZXIgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoaXMgbWV0aG9kIG11c3QgYWxzbyByZXR1cm4gZmFsc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VsDQotCSAqICAgICAgICAgICAgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsNCi0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXNyY09iamVjdCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpIHsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL09wZW5XU1Jlc291cmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjJmODZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvT3BlbldTUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnM7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLmludGVybmFsLnBsdWdpbi5Eb21JbnRlZ3JhdGlvbk1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1wdWJsaWMgY2xhc3MgT3BlbldTUmVzb3VyY2VBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZTIgDQotew0KLQlwcm90ZWN0ZWQgT2JqZWN0IHNyY09iamVjdDsNCi0NCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsNCi0JDQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWk7DQotCXByaXZhdGUgRG9tVXRpbCB1dGlsID0gRG9tVXRpbC5JTlNUQU5DRTsNCi0NCi0JcHJvdGVjdGVkIE9wZW5XU1Jlc291cmNlQWN0aW9uKCkgew0KLQkJdGhpcyhEb21JbnRlZ3JhdGlvbk1lc3NhZ2VzLk9wZW5XU1Jlc291cmNlQWN0aW9uX05hbWUpOw0KLQl9DQotDQotCXByb3RlY3RlZCBPcGVuV1NSZXNvdXJjZUFjdGlvbihTdHJpbmcgdGV4dCkgew0KLQkJc3VwZXIodGV4dCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsNCi0JCWJvb2xlYW4gaXNFbmFibGVkID0gc3VwZXIuaXNFbmFibGVkKCkNCi0JCSYmIHRoaXMucHJvamVjdCE9bnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQl7DQotCQkJcmV0dXJuIGlzRW5hYmxlZDsNCi0JCX0NCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQ0KLQkJDQotCQlpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBJV2ViTWV0aG9kKQ0KLQkJew0KLQkJCXJldHVybiBpc0VuYWJsZWQ7DQotCQl9DQotCQkNCi0JCWlmKHNyY09iamVjdCBpbnN0YW5jZW9mIElXZWJQYXJhbSkNCi0JCXsNCi0JCQlyZXR1cm4gaXNFbmFibGVkOw0KLQkJfQkJDQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsNCi0JCXJ1bigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgdXNlciBoYXMgaW52b2tlZCB0aGlzIGFjdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcnVuKCkgew0KLQkJaWYgKCFpc0VuYWJsZWQoKSkNCi0JCQlyZXR1cm47DQotDQotCQlJQ29tcGlsYXRpb25Vbml0IGN1Ow0KLQkJSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSBudWxsOw0KLQkJSVdlYlBhcmFtIHdlYlBhcmFtID0gbnVsbDsNCi0JCQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYk1ldGhvZCkNCi0JCXsNCi0JCQl3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClzcmNPYmplY3Q7DQotCQkJc3JjT2JqZWN0ID0gc2VpOw0KLQkJfQ0KLQkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKQ0KLQkJew0KLQkJCXdlYlBhcmFtID0gKElXZWJQYXJhbSlzcmNPYmplY3Q7DQotCQkJd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJCXNyY09iamVjdCA9IHNlaTsNCi0JCX0NCi0JCQ0KLQkJdHJ5IHsNCi0NCi0JCQljdSA9IHByb2plY3QuZmluZFR5cGUoKChJSmF2YVdlYlNlcnZpY2VFbGVtZW50KSBzcmNPYmplY3QpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7DQotDQotCQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzYyA9IGdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcihjdS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7DQotCQkNCi0JCQljdSA9IGdldENVVG9PcGVuKGN1LCB3ZWJNZXRob2QpOwkJDQotCQkJaWYgKGN1ID09IG51bGwpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBjb250YWluaW5nIENVIHRvIG9wZW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJDQotCQkJSUZpbGUgZmlsZSA9IGdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihjdS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkpWzBdOyANCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVzYy5nZXRJZCgpKTsNCi0JCQkNCi0JCQlJTWFya2VyIG1hcmtlciA9IGZpbGUuY3JlYXRlTWFya2VyKElNYXJrZXIuVEVYVCk7DQotCQkJSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsNCi0JCQkNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9TVEFSVCwgZ2V0TWFya2VyUG9zaXRpb24oY3UsIHdlYk1ldGhvZCwgZmFsc2UpKTsNCi0JCQltYXAucHV0KElNYXJrZXIuQ0hBUl9FTkQsIGdldE1hcmtlclBvc2l0aW9uKGN1LCB3ZWJNZXRob2QsIHRydWUpKTsNCi0JCQkNCi0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhtYXApOw0KLQkJCQ0KLQkJCUlERS5nb3RvTWFya2VyKGVkaXRvciwgbWFya2VyKTsNCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gb3BlbiBwYXJ0IGVkaXRvciIsIHBpZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKGNlLmdldE1lc3NhZ2UoKSwgY2UpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGludCBnZXRNYXJrZXJQb3NpdGlvbihJQ29tcGlsYXRpb25Vbml0IGN1LCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7DQotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgdHlwZXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmICh3ZWJNZXRob2QgPT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiBnZXRQb3NpdGlvbih0eXBlc1tpaV0sIGVuZFBvcyk7DQotCQkJfQ0KLQ0KLQkJCWZpbmFsIElNZXRob2QgbWV0aG9kID0gdXRpbC5maW5kTWV0aG9kKHR5cGVzW2lpXSwgd2ViTWV0aG9kKTsNCi0JCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gZ2V0UG9zaXRpb24obWV0aG9kLCBlbmRQb3MpOw0KLQkJfQ0KLQkJCQkNCi0JCXJldHVybiAwOw0KLQl9DQotCQ0KLQlwcml2YXRlIGludCBnZXRQb3NpdGlvbihJTWVtYmVyIG1lbWJlciwgYm9vbGVhbiBlbmRQb3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCXJldHVybiBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgKyAoKGVuZFBvcykgPyBtZW1iZXIuZ2V0TmFtZVJhbmdlKCkuZ2V0TGVuZ3RoKCkgOiAwKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldENVVG9PcGVuKElDb21waWxhdGlvblVuaXQgY3UsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpZiAod2ViTWV0aG9kID09IG51bGwpIA0KLQkJew0KLQkJCXJldHVybiBjdTsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJZmluYWwgSVR5cGVbXSB0eXBlcyA9IGN1LmdldFR5cGVzKCk7CQkJDQotCQkJZm9yKGludCBpaT0wOyBpaTx0eXBlcy5sZW5ndGg7IGlpKyspDQotCQkJew0KLQkJCQlJTWV0aG9kIG1ldGhvZCA9IHV0aWwuZmluZE1ldGhvZCh0eXBlc1tpaV0sIHdlYk1ldGhvZCk7DQotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHR5cGVzW2lpXS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlmb3IoaW50IGlpPTA7IGlpPHR5cGVzLmxlbmd0aDsgaWkrKykNCi0JCQl7DQotCQkJCUlUeXBlW10gc3VwZXJJbnRmVHlwZXMgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVySW50ZXJmYWNlcyh0eXBlc1tpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajxzdXBlckludGZUeXBlcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckludGZUeXBlc1tqal0uZ2V0Q29tcGlsYXRpb25Vbml0KCksIHdlYk1ldGhvZCk7DQotCQkJCQkNCi0JCQkJCWlmKGN1VG9PcGVuIT1udWxsKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiBjdVRvT3BlbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQkNCi0JCQkJSVR5cGUgc3VwZXJDbGFzc1R5cGUgPSB0eXBlc1tpaV0ubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldFN1cGVyY2xhc3ModHlwZXNbaWldKTsNCi0JCQkJDQotCQkJCUlDb21waWxhdGlvblVuaXQgY3VUb09wZW4gPSBnZXRDVVRvT3BlbihzdXBlckNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgd2ViTWV0aG9kKTsNCi0JCQkJCQ0KLQkJCQlpZihjdVRvT3BlbiE9bnVsbCkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGN1VG9PcGVuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihqbWUuZ2V0TWVzc2FnZSgpLCBqbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJdXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSUphdmFQcm9qZWN0IHByb2plY3QsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSB7DQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotDQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0Ow0KLQkJdGhpcy5zZWkgPSBzZWk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZA0KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZWFjdCB0byB0aGUgY2hhbmdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdGlvbg0KLQkgKiBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBzZWxlY3Rpb24sIGFuZCBmYWxzZSBvdGhlcndpc2UuDQotCSAqIA0KLQkgKiBXaGVuIHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4sIHRoZSBzdXBlciBtZXRob2QgbXVzdCBhbHdheXMgYmUgaW52b2tlZC4NCi0JICogSWYgdGhlIHN1cGVyIG1ldGhvZCByZXR1cm5zIGZhbHNlLCB0aGlzIG1ldGhvZCBtdXN0IGFsc28gcmV0dXJuIGZhbHNlLg0KLQkgKiANCi0JICogQHBhcmFtIHNlbA0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7DQotCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlzcmNPYmplY3QgPSBzLmdldEZpcnN0RWxlbWVudCgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQkvLyBEaXNwb3NlDQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI2luaXQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7DQotCQkvLyBpbml0DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwNCi0JICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsNCi0JCXJ1bldpdGhFdmVudChldmVudCk7DQotDQotCX0NCi0JDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotDQotCXByaXZhdGUgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7DQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgew0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmRmOGRkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24vc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuYWN0aW9uczsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVTZWxlY3Rpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uQWN0aW9uUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uTWVudUNvbnN0YW50czsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgV1NBY3Rpb25Qcm92aWRlciBleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIA0KLXsNCi0JcHJpdmF0ZSBPcGVuV1NSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOw0KLQ0KLQlwcml2YXRlIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBuYXZpZ2F0ZUFjdGlvbjsNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSANCi0Jew0KLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgDQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7DQotCQkNCi0JCWlmKG5hdmlnYXRlQWN0aW9uLmlzRW5hYmxlZCgpKQ0KLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkZJTkQuZ2V0SWQoKSwgbmF2aWdhdGVBY3Rpb24pOwkNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSANCi0Jew0KLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQ0KLQkJCXJldHVybjsNCi0JCQ0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7DQotCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCW5hdmlnYXRlQWN0aW9uLnNldFRleHQobmF2aWdhdGVBY3Rpb24uZ2V0VGV4dCgpKTsNCi0JCQ0KLQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsNCi0JCQ0KLQkJaWYobmF2aWdhdGVBY3Rpb24uaXNFbmFibGVkKCkpDQotCQkJbWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIG5hdmlnYXRlQWN0aW9uKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBzaXRlKSB7DQotCQlzdXBlci5pbml0KHNpdGUpOw0KLQkJDQotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5XU1Jlc291cmNlQWN0aW9uKCk7DQotCQluYXZpZ2F0ZUFjdGlvbiA9IGluaXROYXZpZ2F0ZUFjdGlvbihzaXRlKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIE5hdmlnYXRlVG9JbXBsZW1lbnRhdGlvbkFjdGlvbiBpbml0TmF2aWdhdGVBY3Rpb24oSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgc2l0ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBOYXZpZ2F0ZVRvSW1wbGVtZW50YXRpb25BY3Rpb24oc2l0ZS5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgY29udGV4dCkgew0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiBjb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIA0KLQkJew0KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29udGV4dC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkNCi0JCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikNCi0JCQl7DQotCQkJCVRyZWVQYXRoW10gcGF0aHMgPSAoKElUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHNGb3Ioc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsNCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGlpPTA7IGlpPHBhdGhzLmxlbmd0aDsgaWkrKykNCi0JCQkJew0KLQkJCQkJVHJlZVBhdGggcGF0aCA9IHBhdGhzW2lpXTsNCi0JCQkJCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gbnVsbDsNCi0JCQkJCQ0KLQkJCQkJZm9yKGludCBqaj0wOyBqajxwYXRoLmdldFNlZ21lbnRDb3VudCgpOyBqaisrKQ0KLQkJCQkJew0KLQkJCQkJCWlmKHBhdGguZ2V0U2VnbWVudChqaikgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKQ0KLQkJCQkJCXsNCi0JCQkJCQkJc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpcGF0aC5nZXRTZWdtZW50KGpqKTsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJDQotCQkJCQlmb3IoaW50IGpqPTA7IGpqPHBhdGguZ2V0U2VnbWVudENvdW50KCk7IGpqKyspDQotCQkJCQl7DQotCQkJCQkJaWYocGF0aC5nZXRTZWdtZW50KGpqKSBpbnN0YW5jZW9mIElQcm9qZWN0KQ0KLQkJCQkJCXsNCi0JCQkJCQkJcHJvamVjdCA9IChJUHJvamVjdClwYXRoLmdldFNlZ21lbnQoamopOw0KLQkJCQkJCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBnZXRKYXZhUHJvamVjdChwcm9qZWN0KSwgc2VpKTsNCi0JCQkJCQkJbmF2aWdhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24sIGdldEphdmFQcm9qZWN0KHByb2plY3QpKTsNCi0JCQkJCQkJc3VwZXIuc2V0Q29udGV4dChjb250ZXh0KTsNCi0JCQkJCQkJcmV0dXJuOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCQkNCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsNCi0JCQluYXZpZ2F0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldENvbnRleHQoY29udGV4dCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3OTM4NzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSnVsIDIwIDE1OjI1OjMxIEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGNkNDRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDINCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjANCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXINCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZVBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLnVpLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywNCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudGVzdHMiLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3RhdGUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXIsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE4M2E1NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgTGFuZ3VhZ2UgRmlsZSBmb3IgdGhpcyBQbHVnaW4NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyBHZW5lcmljIExhYmVsIGFuZCBEZXNjcmlwdGlvbg0KLUJ1bmRsZS1OYW1lLjA9SkFYLVdTIERPTSBydW50aW1lIHBsdWctaW4gKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQotDQotRG9tUnVudGltZXNFeHRlbnNpb25fTmFtZSA9IERPTSBSdW50aW1lcw0KLUV4dGVuc2lvblBvaW50LU5hbWUuMyA9IEpFRTUgRE9NIGNvbnRyaWJ1dGlvbg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NzQ2YTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08IS0tDQotICAgIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gICANCi0gICAgQ29udHJpYnV0b3JzOg0KLSAgICAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIC0tPg0KLQ0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZG9tcnVudGltZXMiIG5hbWU9IiVEb21SdW50aW1lc0V4dGVuc2lvbl9OYW1lIiBzY2hlbWE9InNjaGVtYS9ydW50aW1lcy5leHNkIi8+DQotICAgICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+DQotICAgCTxwYWNrYWdlIA0KLSAgICAgICB1cmkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIiANCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlIiAvPg0KLSAgCTwvZXh0ZW5zaW9uPg0KLQ0KLQ0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IiANCi0gICAgICAgICBuYW1lPSIlRXh0ZW5zaW9uUG9pbnQtTmFtZS4zIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuZG9tcnVudGltZXMiPg0KLSAgICAgIDxpbXBsZW1lbnRhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkplZTVXc0RvbVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICA8cHJvamVjdF9mYWNldCBpZD0ianN0LmVqYiIgdmVyc2lvbj0iMy4wIi8+DQotICAgICAgPHByb2plY3RfZmFjZXQgaWQ9ImpzdC53ZWIiIHZlcnNpb249IjIuNSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NjaGVtYS9ydW50aW1lcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ5M2ViMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc2NoZW1hL3J1bnRpbWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiBpZD0ic3VwcG9ydGVkcnVudGltZXMiIG5hbWU9IlN1cHBvcnRlZCBSdW50aW1lcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBVc2UgdGhpcyBleHRlbnNpb24gcG9pbnQgdG8gYWRkIHN1cHBvcnQgZm9yIGEgcnVudGltZSBpbiB0aGUgV1MgRE9NIFRyZWUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4NCi0gICAgICAgICA8L2FwcEluZm8+DQotICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHJvamVjdF9mYWNldCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImltcGxlbWVudGF0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb24iLz4NCi0gICAgICAgICAgICAgICA8L2FwcEluZm8+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InByb2plY3RfZmFjZXQiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotDQotPC9zY2hlbWE+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9Eb21VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjdkMThjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0RvbVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21Td2l0Y2g7DQotDQotDQotcHVibGljIGNsYXNzIERvbVV0aWwNCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tVXRpbCBJTlNUQU5DRSA9IG5ldyBEb21VdGlsKCk7DQotCQ0KLQlwcml2YXRlIGZpbmFsIERvbVN3aXRjaDxTdHJpbmc+IGltcGxTd2l0Y2g7DQotCQ0KLQlwdWJsaWMgRG9tVXRpbCgpIHsNCi0JCWltcGxTd2l0Y2ggPSBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVWYWx1ZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCwgZmluYWwgT2JqZWN0IHZhbHVlKQ0KLQl7DQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IG9iamVjdC5lQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZUlkKTsNCi0JCW9iamVjdC5lU2V0KGZlYXR1cmUsIHZhbHVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmVWYWx1ZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCkNCi0Jew0KLQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvYmplY3QuZUNsYXNzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKGZlYXR1cmVJZCk7DQotCQlyZXR1cm4gb2JqZWN0LmVHZXQoZmVhdHVyZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkVG9Db2xsZWN0aW9uRmVhdHVyZShmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IGZlYXR1cmVJZCwgZmluYWwgT2JqZWN0IHZhbHVlKQ0KLQl7DQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JCWZpbmFsIENvbGxlY3Rpb248T2JqZWN0PiBvbGRWYWx1ZSA9IChDb2xsZWN0aW9uPE9iamVjdD4pIGdldEZlYXR1cmVWYWx1ZShvYmplY3QsIGZlYXR1cmVJZCk7DQotCQlvbGRWYWx1ZS5hZGQodmFsdWUpOw0KLQl9DQotDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeU5hbWUoSURPTSBkb20sIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QgOiBkb20uZ2V0V2ViU2VydmljZVByb2plY3RzKCkpDQotCQl7DQotCQkJaWYgKHdzUHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVdlYlNlcnZpY2UgZmluZFdzQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJvamVjdC5nZXRXZWJTZXJ2aWNlcygpKQ0KLQkJew0KLQkJCWlmICh3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiB3czsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpQnlJbXBsTmFtZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpDQotCQl7DQotCQkJaWYgKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBzZWk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgSVdlYk1ldGhvZCBmaW5kV2ViTWV0aG9kQnlJbXBsKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZm9yIChJV2ViTWV0aG9kIHdtIDogc2VpLmdldFdlYk1ldGhvZHMoKSkNCi0JCXsNCi0JCQlpZiAod20uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBJTWV0aG9kIGZpbmRNZXRob2QoZmluYWwgSVR5cGUgc2VpVHlwZSwgZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHNlaVR5cGUuZ2V0TWV0aG9kcygpKSANCi0JCXsNCi0JCQlpZiAod2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKSkgew0KLQkJCQlyZXR1cm4gbWV0aG9kOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0JDQotDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGZpbmRKYXZhV2ViU2VydmljZUVsZW1CeUltcGxOYW1lKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IGZpbmRXc0J5SW1wbE5hbWUod3NQcm9qZWN0LCBuYW1lKTsNCi0JCXJldHVybiB3cyA9PSBudWxsID8gZmluZFNlaUJ5SW1wbE5hbWUod3NQcm9qZWN0LCBuYW1lKSA6IHdzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ2FsY3VsYXRlcyB0aGUgbWV0aG9kIHNpZ25hdHVyZSB0byBiZSB1c2VkIGFzIGltcGxlbWVudGF0aW9uIGluIHtAbGluayBJV2ViTWV0aG9kfQ0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBzdHJpbmcNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY2FsY0ltcGxlbWVudGF0aW9uKGZpbmFsIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsJCQ0KLQkJcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgbWV0aG9kLmdldFNpZ25hdHVyZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRXh0cmFjdCB7QGxpbmsgSVdlYlNlcnZpY2VQcm9qZWN0fSBvdXQgb2YgRE9NIG9iamVjdCBieSByZWN1cnNpdmVseQ0KLQkgKiBpdGVyYXRpbmcgcGFyZW50IG9iamVjdHMuDQotCSAqIEBwYXJhbSBlT2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIGZvdW5kIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSBub3QgZm91bmQNCi0JICovDQotCXB1YmxpYyBJV2ViU2VydmljZVByb2plY3QgZmluZFdzUHJvamVjdChFT2JqZWN0IGVPYmplY3QpDQotCXsNCi0JCUVPYmplY3QgcGFyZW50ID0gZU9iamVjdDsNCi0JCXdoaWxlIChwYXJlbnQhPW51bGwpIA0KLQkJew0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpIHsNCi0JCQkJcmV0dXJuIChJV2ViU2VydmljZVByb2plY3QpcGFyZW50Ow0KLQkJCX0NCi0JCQkNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkJDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyBpZiB0aGlzIFNFSSBpcyBwYXJ0IG9mIG91dHNpZGUtaW4gd2ViIHNlcnZpY2UNCi0JICogQHBhcmFtIHNlaQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYSB3ZWIgc2VydmljZSB3aXRoIHdzZGxMb2NhdGlvbiBzZXQgdG8gc29tZXRoaW5nIGRpZmZlcmVudCB0aGFuIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc091dHNpZGVJbldlYlNlcnZpY2UoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJV2ViU2VydmljZSB3ZWJTZXJ2aWNlIDogc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpIHsNCi0JCQlpZiAod2ViU2VydmljZS5nZXRXc2RsTG9jYXRpb24oKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBDYWxjdWxhdGVzIHVuaXF1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgRE9NIG9iamVjdCBpbiB0aGUgc2NvcGUgb2YgdGhlIHJlc291cmNlIGluIHdoaWNoDQotCSAqIHRoZXkgZXhpc3QuIFVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IERPTSBvYmplY3QuIA0KLQkgKiANCi0JICogQHBhcmFtIGVPYmplY3QNCi0JICogQHJldHVybiBjYWxjdWxhdGVkIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNVbmlxdWVJbXBsKGZpbmFsIEVPYmplY3QgZU9iamVjdCkNCi0Jew0KLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkgPT0gRG9tUGFja2FnZS5JV0VCX1BBUkFNKSANCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gd3AgPSAoSVdlYlBhcmFtKSBlT2JqZWN0Ow0KLQkJCXJldHVybiAoKElXZWJNZXRob2Qpd3AuZUNvbnRhaW5lcigpKS5nZXRJbXBsZW1lbnRhdGlvbigpICsgIlsiICsgd3AuZ2V0SW1wbGVtZW50YXRpb24oKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiBleHRyYWN0SW1wbGVtZW50YXRpb24oZU9iamVjdCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBFeHRyYWN0cyB0aGUgaW1wbGVtZW50YXRpb24gcHJvcGVydHkgZm9yIERPTSBvYmplY3Qgd2l0aG91dCBjYXN0aW5nIDotRC4NCi0JICoNCi0JICogQHBhcmFtIGVPYmplY3QNCi0JICogQHJldHVybiB0aGUgaW1wbGVtZW50YXRpb24gDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RJbXBsZW1lbnRhdGlvbihmaW5hbCBFT2JqZWN0IGVPYmplY3QpIHsNCi0JCXJldHVybiBpbXBsU3dpdGNoLmRvU3dpdGNoKGVPYmplY3QpOw0KLQl9DQotCQ0KLQlwcml2YXRlIERvbVN3aXRjaDxTdHJpbmc+IGNyZWF0ZUltcGxGaW5kZXJTd2l0Y2goKQ0KLQl7DQotCQlyZXR1cm4gbmV3IERvbVN3aXRjaDxTdHJpbmc+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSB3cykgew0KLQkJCQlyZXR1cm4gd3MuZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSkgew0KLQkJCQlyZXR1cm4gc2VpLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCB3bSkgew0KLQkJCQlyZXR1cm4gd20uZ2V0SW1wbGVtZW50YXRpb24oKTsNCi0JCQl9CQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJQYXJhbShJV2ViUGFyYW0gd3ApIHsNCi0JCQkJcmV0dXJuIHdwLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KSB7DQotCQkJCXJldHVybiB3c1Byb2plY3QuZ2V0TmFtZSgpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9HZW5lcmFsVHlwZXNOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9HZW5lcmFsVHlwZXNOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwYzRiZGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvR2VuZXJhbFR5cGVzTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLS8qKg0KLSAqIENsYXNzIGNvbnRhaW5pbmcgY29uc3RhdG5zIHdpdGggbmFtZXMgb2Ygc29tZSBnZW5lcmFsIHR5cGVzIHVzZWQgb2Z0ZW4gaW4gdmFsaWRhdGlvbi4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICogDQotICovDQotDQotcHVibGljIGludGVyZmFjZSBHZW5lcmFsVHlwZXNOYW1lcw0KLXsNCi0JLyoqIGphdmEubGFuZy5PYmplY3QgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX09CSkVDVCA9ICJqYXZhLmxhbmcuT2JqZWN0IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5pby5TZXJpYWxpemFibGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9JT19TRVJJQUxJWkFCTEUgPSAiamF2YS5pby5TZXJpYWxpemFibGUiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLnJtaS5SZW1vdGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9STUlfUkVNT1RFID0gImphdmEucm1pLlJlbW90ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5UaHJvd2FibGUgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9MQU5HX1RIUk9XQUJMRSA9ICJqYXZhLmxhbmcuVGhyb3dhYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS5sYW5nLkV4Y2VwdGlvbiAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xBTkdfRVhDRVBUSU9OID0gImphdmEubGFuZy5FeGNlcHRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLmxhbmcuQ2xvbmVhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19DTE9ORUFCTEUgPSAiamF2YS5sYW5nLkNsb25lYWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqIGphdmEubGFuZy5Db21wYXJhYmxlICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTEFOR19DT01QQVJBQkxFID0gImphdmEubGFuZy5Db21wYXJhYmxlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogamF2YS51dGlsLk1hcCAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1VUSUxfTUFQID0gImphdmEudXRpbC5NYXAiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiBqYXZhLnV0aWwuQ29sbGVjdGlvbiAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1VUSUxfQ09MTEVDVElPTiA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U1MDlhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lOYW1lZEV4dGVuc2lvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpZyBhbmQgZXh0ZW50aW9uLg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0NCi0JLyoqDQotCSAqIFRoZSB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgdGhpcyBjb25zdW1lciB0eXBlIHdoZW4gY2FsbGluZyB0aGUgPGNvZGU+UHJveHlHZW5lcmF0b3JGYWN0b3J5PC9jb2RlPiwgZS5nLiA8Y29kZT5qZWUvamF4d3M8L2NvZGU+DQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vbi1lbXB0eSBzdHJpbmcgY29udGFpbmluZyB0aGUgSUQNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SWQoKTsNCi0NCi0JLyoqDQotCSAqIEEgdmVyYm9zZSBuYW1lIGZvciB0aGUgdHlwZSBvZiBjb25zdW1lciwgZS5nLiA8Y29kZT5KQVgtV1M8L2NvZGU+DQotCSAqIA0KLQkgKiBAcmV0dXJuIGxvY2FsaXplZCBzdHJpbmcgdXNlZCBmb3IgdGhlIFVJDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlEZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2JjZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvSVByb3BlcnR5RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGRlZmF1bHQgdmFsdWVzIGZvciBET00gb2JqZWN0J3MgcHJvcGVydGllcy4NCi0gKiBVc3VhbGx5IHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSB1c2VkIGJ5IGNsaWVudHMgdGhhdCBuZWVkIHRvIHJldmVydCBzb21lDQotICogcHJvcGVydHkgdmFsdWUgdG8gdGhlIGRlZmF1bHQgb25lLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgPGNvZGU+ZmVhdHVyZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZSByZXByZXNlbnRpbmcgdGhlIG9iamVjdHMgcHJvcGVydHkgdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLiBJbiBjYXNlIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBvc3NpYmxlIHByb3BlcnR5IHZhbHVlDQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG1pZ2h0IGJlIHJldHVybmVkDQotCSAqLw0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL0lQcm9wZXJ0eVN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU4YzRlOWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9JUHJvcGVydHlTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotDQotLyoqDQotICogSW50ZXJmYWNlIGZvciBjaGVja2luZyB0aGUgc3RhdGUgb2Ygc29tZSBwcm9wZXJ0eSBmb3IgY29uY3JldGUgRE9NIG9iamVjdC4NCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgdXNlZCBieSBET00gY2xpZW50cyB0aGF0IG5lZWQgdG8ga25vdyBpZiBzb21lIHByb3BlcnR5IA0KLSAqIGNhbiBiZSBjaGFuZ2VkIC0gZm9yIGV4YW1wbGUgVUkgZWRpdG9yIHRoYXQgbmVlZHMgdG8ga25vdyBpZiB0aGUgcHJvcGVydHkgc2hvdWxkDQotICogYmUgZW5hYmxlZCBmb3IgZWRpdCBvciBkaXNhYmxlZC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvcGVydHlTdGF0ZSANCi17DQotCS8qKg0KLQkgKiBEZWZpbmVzIGlmIHByb3BlcnR5IGlzIGNoYW5nZWFibGUuDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSBwcm9wZXJ0eSBjYW4gYmUgY2hhbmdlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VhYmxlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9QcmltaXRpdmVUeXBlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9QcmltaXRpdmVUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNTEyN2IyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvUHJpbWl0aXZlVHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotLyoqDQotICogVXRpbGl0eSBjbGFzcyB1c2VkIGZvciBzb21lIGdlbmVyYWwgcHJpbWl0aXZlIHR5cGUgY2hlY2tzL29wZXJhdGlvbnMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqIA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVUeXBlSGFuZGxlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSUkFZX01BUksgPSAiW10iOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEID0gInZvaWQiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJpbWl0aXZlVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0NCi0Jc3RhdGljDQotCXsNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiYm9vbGVhbiIsICJqYXZhLmxhbmcuQm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiamF2YS5sYW5nLkJvb2xlYW4iLCAiamF2YS5sYW5nLkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImJ5dGUiLCAiamF2YS5sYW5nLkJ5dGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5CeXRlIiwgImphdmEubGFuZy5CeXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJjaGFyIiwgImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5DaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiZG91YmxlIiwgImphdmEubGFuZy5Eb3VibGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Eb3VibGUiLCAiamF2YS5sYW5nLkRvdWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCXByaW1pdGl2ZVR5cGVzLnB1dCgiZmxvYXQiLCAiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuRmxvYXQiLCAiamF2YS5sYW5nLkZsb2F0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJpbnQiLCAiamF2YS5sYW5nLkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEubGFuZy5TdHJpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImxvbmciLCAiamF2YS5sYW5nLkxvbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5Mb25nIiwgImphdmEubGFuZy5Mb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcHJpbWl0aXZlVHlwZXMucHV0KCJzaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlwcmltaXRpdmVUeXBlcy5wdXQoImphdmEubGFuZy5TaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG9iamVjdCB0eXBlIGZvciBwcmltaXRpdmUgdHlwZS4gTWFwcGluZyBiZXR3ZWVuIHR5cGVzOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogICZxdW90O2Jvb2xlYW4sICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuQm9vbGVhbiZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDssICAgJnF1b3Q7amF2YS5sYW5nLkJvb2xlYW4mcXVvdDsNCi0JICogICZxdW90O2J5dGUmcXVvdDssICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5CeXRlJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90OywgICAgICAmcXVvdDtqYXZhLmxhbmcuQnl0ZSZxdW90Ow0KLQkgKiAgJnF1b3Q7Y2hhciZxdW90OywgICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90OywgJnF1b3Q7amF2YS5sYW5nLkNoYXJhY3RlciZxdW90Ow0KLQkgKiAgJnF1b3Q7ZG91YmxlJnF1b3Q7LCAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90OywgICAgJnF1b3Q7amF2YS5sYW5nLkRvdWJsZSZxdW90Ow0KLQkgKiAgJnF1b3Q7ZmxvYXQmcXVvdDssICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkZsb2F0JnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuRmxvYXQmcXVvdDssICAgICAmcXVvdDtqYXZhLmxhbmcuRmxvYXQmcXVvdDsNCi0JICogICZxdW90O2ludCZxdW90OywgICAgICAgICAgICAgICAgICZxdW90O2phdmEubGFuZy5JbnRlZ2VyJnF1b3Q7DQotCSAqICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90OywgICAmcXVvdDtqYXZhLmxhbmcuSW50ZWdlciZxdW90Ow0KLQkgKiAgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90OywgICAgJnF1b3Q7amF2YS5sYW5nLlN0cmluZyZxdW90Ow0KLQkgKiAgJnF1b3Q7bG9uZyZxdW90OywgICAgICAgICAgICAgICAgJnF1b3Q7amF2YS5sYW5nLkxvbmcmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7LCAgICAgICZxdW90O2phdmEubGFuZy5Mb25nJnF1b3Q7DQotCSAqICAmcXVvdDtzaG9ydCZxdW90OywgICAgICAgICAgICAgICAmcXVvdDtqYXZhLmxhbmcuU2hvcnQmcXVvdDsNCi0JICogICZxdW90O2phdmEubGFuZy5TaG9ydCZxdW90OywgICAgICZxdW90O2phdmEubGFuZy5TaG9ydCZxdW90Ow0KLQkgKiA8L3ByZT4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcmV0dXJuIHdyYXBwZXIgY2xhc3MgbmFtZSBmb3IgPHR0PnR5cGVOYW1lPC90dD4uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPYmplY3RUeXBlRm9yUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiBwcmltaXRpdmVUeXBlcy5nZXQodHlwZU5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGphdmEgcHJpbWl0aXZlIHR5cGUuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXZhUHJpbWl0aXZlVHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiAocHJpbWl0aXZlVHlwZXMuZ2V0KHR5cGVOYW1lKSAhPSBudWxsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIGlmIHRoZSA8dHQ+dHlwZU5hbWU8L3R0PiByZXByZXNlbnRzIGFuIGFycmF5IHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGFycmF5IHR5cGUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiB0eXBlTmFtZS50cmltKCkuZW5kc1dpdGgoQVJSQVlfTUFSSyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyB2b2lkLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiA8dHQ+dHlwZU5hbWU8L3R0PiBpcyB2b2lkLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVm9pZFR5cGUoU3RyaW5nIHR5cGVOYW1lKQ0KLQl7DQotCQlyZXR1cm4gdHlwZU5hbWUudHJpbSgpLmVxdWFscyhWT0lEKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSByZWFsIHR5cGUgbmFtZSBmcm9tIGFycmF5IHR5cGUuIEV4YW1wbGU6DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgIEZvciB0eXBlICdpbnRbXScgcmV0dXJucyAnaW50Jw0KLQkgKiAgIEZvciB0eXBlICdTdHJpbmdbXVtdJyByZXR1cm5zICdTdHJpbmcnDQotCSAqIDwvcHJlPg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEByZXR1cm4gcmVhbCB0eXBlIG5hbWUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVGcm9tQXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkNCi0Jew0KLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZS50cmltKCkucmVwbGFjZUFsbCgiICIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl3aGlsZSAobmFtZS5lbmRzV2l0aChBUlJBWV9NQVJLKSkNCi0JCXsNCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIEFSUkFZX01BUksubGVuZ3RoKCkpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9UeXBlUmVzb2x2ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvVHlwZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyNDE4ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9UeXBlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGNvbnRhaW5pbmcgbG9naWMgZm9yIHJlc29sdmluZyB0eXBlIG5hbWVzIGZyb20gSVR5cGUgb2JqZWN0Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVHlwZVJlc29sdmVyDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URSA9ICI/IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZXMgPHR0PnR5cGVOYW1lPC90dD4gdXNpbmcgPHR0PnR5cGU8L3R0Pi4gSW4gY2FzZSB3aGVuIDx0dD50eXBlTmFtZTwvdHQ+IGNvbnRhaW5zIGdlbmVyaWNzIGRlY2xhcmF0aW9uIGFsbCB0eXBlcyB1c2VkIGluDQotCSAqIGRlY2xhcmFpb24gYXJlIHJldHVybmVkLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGVOYW1lDQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gbGlzdCBvZiByZXNvbHZlZCB0eXBlcw0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcmVzb2x2ZVR5cGVzKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMSk7DQotCQlTdHJpbmcgcmVhbFR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVOYW1lKTsNCi0NCi0JCWlmIChoYXNHZW5lcmljcyhyZWFsVHlwZU5hbWUpKQ0KLQkJew0KLQkJCW5hbWVzID0gZ2V0VHlwZXNGcm9tR2VuZXJpY3MocmVhbFR5cGVOYW1lLCB0eXBlKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCW5hbWVzLmFkZChyZWFsVHlwZU5hbWUpOw0KLQkJfQ0KLQ0KLQkJTGlzdDxTdHJpbmc+IHJlc29sdmVkTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obmFtZXMuc2l6ZSgpKTsNCi0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykNCi0JCXsNCi0JCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gcmVzb2x2ZVR5cGUobmFtZSwgdHlwZSk7DQotDQotCQkJaWYgKCFyZXNvbHZlZE5hbWUuZXF1YWxzKFFVT1RFKSkNCi0JCQl7DQotCQkJCXJlc29sdmVkTmFtZXMuYWRkKHJlc29sdmVkTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc29sdmVkTmFtZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyByZWFsIHR5cGUgaW4gY2FzZSB0eXBlIGlzIHByZXNlbnQgYnkgZ2VuZXJpY3MuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIGRlY2xhcmluZ1R5cGUNCi0JICogQHJldHVybiB0aGUgcmVhbCB0eXBlIG9mIHRoZSBleHByZXNzaW9uIGlmIDx0dD50eXBlTmFtZTwvdHQ+IGlzIGFuIGV4cHJlc3Npb24gb3RoZXJ3aXNlIDx0dD50eXBlTmFtZTwvdHQ+DQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHR5cGVOYW1lLmluZGV4T2YoJz8nKSA+IC0xKQ0KLQkJew0KLQkJCWludCBwb3MgPSB0eXBlTmFtZS50cmltKCkubGFzdEluZGV4T2YoJyAnKTsNCi0JCQlpZiAocG9zID4gLTEpDQotCQkJew0KLQkJCQlyZXR1cm4gVHlwZVJlc29sdmVyLnJlc29sdmVUeXBlKHR5cGVOYW1lLnN1YnN0cmluZyhwb3MgKyAxKSwgZGVjbGFyaW5nVHlwZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHR5cGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSB0eXBlcyB1c2VkIGluIGdlbmVyaWNzIGRlY2xhcmF0aW9uLg0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgY29udGFpbmluZyByZXNvbHZlZCB0eXBlDQotCSAqIEByZXR1cm4gbGlzdCBvZiB0eXBlIG5hbWVzLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldFR5cGVzRnJvbUdlbmVyaWNzKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwkJCQ0KLQkJTGlzdDxTdHJpbmc+IG5hbWVzPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0JCQ0KLQkJaW50IGx0UG9zID0gLTE7CQkNCi0JCWludCBndFBvcyA9IC0xOw0KLQkJd2hpbGUgKChsdFBvcyA9IG5hbWUuaW5kZXhPZignPCcpKSA+IC0xKQ0KLQkJewkJCQ0KLQkJCWlmICgoZ3RQb3MgPSBuYW1lLmxhc3RJbmRleE9mKCc+JykpID09IC0xKQ0KLQkJCXsNCi0JCQkJZ3RQb3MgPSBuYW1lLmxlbmd0aCgpLTI7DQotCQkJfQ0KLQkJCQ0KLQkJCVN0cmluZyBmaXJzdE5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBsdFBvcykgKyBuYW1lLnN1YnN0cmluZyhndFBvcysxKTsNCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcobHRQb3MrMSwgZ3RQb3MpOw0KLQkJCQ0KLQkJCWFkZE5hbWUoZmlyc3ROYW1lLCBuYW1lcywgdHlwZSk7DQotCQkJaWYgKG5hbWUuaW5kZXhPZignPCcpID09IC0xKSANCi0JCQl7DQotCQkJCWFkZE5hbWUobmFtZSwgbmFtZXMsIHR5cGUpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5hbWVzOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCB2b2lkIGFkZE5hbWUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcywgZmluYWwgSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpbnQgY29tYVBvcyA9IG5hbWUuaW5kZXhPZignLCcpOw0KLQkJaWYoIGNvbWFQb3MgPiAtMSkNCi0JCXsNCi0JCQluYW1lcy5hZGQobmFtZS5zdWJzdHJpbmcoMCwgY29tYVBvcykpOw0KLQkJCW5hbWVzLmFkZChuYW1lLnN1YnN0cmluZyhjb21hUG9zKzEpKTsNCi0JCX0gDQotCQllbHNlIHsNCi0JCQluYW1lcy5hZGQoZ2V0VHlwZShuYW1lLCB0eXBlKSk7DQotCQl9CQkNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZXMgdHlwZS4NCi0JICogDQotCSAqIEBwYXJhbSB0eXBlTmFtZQ0KLQkgKiBAcGFyYW0gdHlwZQ0KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCB0eXBlIG5hbWUuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlVHlwZShmaW5hbCBTdHJpbmcgdHlwZU5hbWUsIGZpbmFsIElUeXBlIHR5cGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWxUeXBlTmFtZSA9IHR5cGVOYW1lOw0KLQkJaWYgKFByaW1pdGl2ZVR5cGVIYW5kbGVyLmlzQXJyYXlUeXBlKHR5cGVOYW1lKSkNCi0JCXsNCi0JCQlyZXR1cm4gcmVzb2x2ZVR5cGUoUHJpbWl0aXZlVHlwZUhhbmRsZXIuZ2V0VHlwZUZyb21BcnJheVR5cGUodHlwZU5hbWUpLCB0eXBlKTsNCi0JCX0NCi0NCi0JCWlmIChQcmltaXRpdmVUeXBlSGFuZGxlci5pc0phdmFQcmltaXRpdmVUeXBlKHJlYWxUeXBlTmFtZSkgfHwgUHJpbWl0aXZlVHlwZUhhbmRsZXIuaXNWb2lkVHlwZShyZWFsVHlwZU5hbWUpKQ0KLQkJew0KLQkJCXJldHVybiByZWFsVHlwZU5hbWU7DQotCQl9DQotDQotCQlpZiAocmVhbFR5cGVOYW1lLmluZGV4T2YoRE9UKSA+IC0xKQ0KLQkJew0KLQkJCXJldHVybiByZWFsVHlwZU5hbWU7DQotCQl9DQotDQotCQlTdHJpbmdbXVtdIHN0ID0gdHlwZS5yZXNvbHZlVHlwZShyZWFsVHlwZU5hbWUpOw0KLQkJaWYgKHN0ICE9IG51bGwpDQotCQl7DQotCQkJaWYgKHN0WzBdWzBdLmxlbmd0aCgpID09IDApDQotCQkJew0KLQkJCQlyZXR1cm4gc3RbMF1bMV07DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBzdFswXVswXSArIERPVCArIHN0WzBdWzFdOw0KLQkJfQ0KLQ0KLQkJaWYgKHJlYWxUeXBlTmFtZS5zdGFydHNXaXRoKG5ldyBTdHJpbmcobmV3IGNoYXJbXSB7IFNpZ25hdHVyZS5DX1VOUkVTT0xWRUQgfSkpKQ0KLQkJew0KLQkJCXJldHVybiByZXNvbHZlVHlwZShyZWFsVHlwZU5hbWUuc3Vic3RyaW5nKDEsIHJlYWxUeXBlTmFtZS5sZW5ndGgoKSksIHR5cGUpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWxUeXBlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgPGNvZGU+dHlwZU5hbWU8L2NvZGU+IHVzZXMgZ2VuZXJpY3MgZGVjbGFyYXRpb24uIEV4YW1wbGU6IGZvciAnamF2YS51dGlsLkxpc3Q8U3Rybmc+JyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRydWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZU5hbWUNCi0JICogQHJldHVybiB0cnVlIGlzIDx0dD50eXBlTmFtZTwvdHQ+IGNvbnRhaW5zIGdlbmVyaWNzIGRlY2xhcmF0aW9uLg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNHZW5lcmljcyhTdHJpbmcgdHlwZU5hbWUpDQotCXsNCi0JCXJldHVybiAodHlwZU5hbWUuaW5kZXhPZignPCcpID4gLTEpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvV3NEb21TdGFydHVwUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEyMTAwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL1dzRG9tU3RhcnR1cFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTVJ1bnRpbWVNYW5hZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwucGx1Z2luLkpheFdzRG9tUnVudGltZU1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsNCi0NCi0vKioNCi0gKiBTdGFydHVwIHBhcnRpY2lwYW50IHJlZ2lzdGVyZWQgb24gSURFIHN0YXJ0dXAgZXh0ZW5zaW9uIHBvaW50DQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTdGFydHVwIA0KLXsNCi0JDQotCS8qKg0KLQkgKiBDYWxsZWQgYnkgdGhlIEVjbGlwc2Ugb24gd29ya2JlbmNoIHN0YXJ0dXAuDQotCSAqIFN0YXJ0cyBsb2FkIGZvciByZWdpc3RlcmVkIHdlYiBzZXJ2aWNlIHJ1bnRpbWVzIA0KLQkgKi8NCi0gICAgcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkNCi0gICAgew0KLQkJSm9iIGpvYiA9IG5ldyBKb2IoSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZSkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXsNCi0JCSAgICAJV3NET01SdW50aW1lTWFuYWdlci5pbnN0YW5jZSgpLmNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQkJICAgIAlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlqb2Iuc2V0VXNlcihmYWxzZSk7DQotCQlqb2Iuc2V0UHJpb3JpdHkoSm9iLkxPTkcpOw0KLQkJam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7DQotCQlqb2Iuc2NoZWR1bGUoKTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhODc2MTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvRG9tRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5Ow0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuDQotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBEb21GYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkgew0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tRmFjdG9yeUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJRE9NIGNyZWF0ZUlET00oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSUphdmFXZWJTZXJ2aWNlRWxlbWVudCBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViTWV0aG9kIGNyZWF0ZUlXZWJNZXRob2QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlBhcmFtIGNyZWF0ZUlXZWJQYXJhbSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5JV2ViIFNlcnZpY2U8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JSVdlYlNlcnZpY2UgY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViU2VydmljZVByb2plY3QgY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPklXZWIgVHlwZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlJV2ViVHlwZSBjcmVhdGVJV2ViVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKTsNCi0NCi19IC8vRG9tRmFjdG9yeQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0RvbVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDZhYWIwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Eb21QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLg0KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQNCi0gKiA8dWw+DQotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPg0KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+DQotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4NCi0gKiA8L3VsPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5DQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgRG9tUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsNCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZU5BTUUgPSAiZG9tIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2RvbS5lY29yZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwuaW5pdCgpOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCA8ZW0+SURPTTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklET01JbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJRE9NID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklET008L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSURPTV9GRUFUVVJFX0NPVU5UID0gMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVCA9IDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMjsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UgPSAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRBVElPTiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50aW5nIFdlYiBTZXJ2aWNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsIDxlbT5JV2ViIE1ldGhvZDwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX01FVEhPRF9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlZDwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19FWENMVURFRCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFVzZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0Ow0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgTWV0aG9kPC9lbT4nIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsIDxlbT5JV2ViIFBhcmFtPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNID0gNDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19LSU5EID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlYWRlcjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfUEFSQU1fX0hFQURFUiA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBQYXJhbTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1BBUkFNX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1Ow0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwgPGVtPklXZWIgU2VydmljZTwvZW0+fScgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRSA9IDU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX0lNUExFTUVOVEFUSU9OID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT047DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fTkFNRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IE5hbWVzcGFjZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9fVEFSR0VUX05BTUVTUEFDRSA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX19QT1JUX05BTUUgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldzZGwgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOw0KLQ0KLQkvKioNCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPklXZWIgU2VydmljZTwvZW0+JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfRkVBVFVSRV9DT1VOVCA9IElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VQcm9qZWN0SW1wbA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJTZXJ2aWNlUHJvamVjdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVCA9IDY7DQotDQotCS8qKg0KLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTID0gMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMgPSAxOw0KLQ0KLQkvKioNCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCWludCBJV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRSA9IDI7DQotDQotCS8qKg0KLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SVdlYiBTZXJ2aWNlIFByb2plY3Q8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9TRVJWSUNFX1BST0pFQ1RfRkVBVFVSRV9DT1VOVCA9IDM7DQotDQotCS8qKg0KLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlR5cGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFID0gNzsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBsZW1lbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JaW50IElXRUJfVFlQRV9fSU1QTEVNRU5UQVRJT04gPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjsNCi0NCi0JLyoqDQotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX19OQU1FID0gSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRTsNCi0NCi0JLyoqDQotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5JV2ViIFR5cGU8L2VtPicgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlpbnQgSVdFQl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOw0KLQ0KLQkvKioNCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZCA8ZW0+V2ViIFBhcmFtIEtpbmQ8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0V2ViUGFyYW1LaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFdFQl9QQVJBTV9LSU5EID0gODsNCi0NCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlIDxlbT5TT0FQIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGVudW0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnQgU09BUF9CSU5ESU5HX1NUWUxFID0gOTsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZSA8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+fScgZW51bS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19VU0UgPSAxMDsNCi0NCi0JLyoqDQotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JaW50IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSAxMTsNCi0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSA8ZW0+SURPTTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SURPTSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTSNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzKCkNCi0JICogQHNlZSAjZ2V0SURPTSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCA8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGVtZW50YXRpb248L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldEltcGxlbWVudGF0aW9uKCkNCi0JICogQHNlZSAjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9JbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X05hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQgPGVtPkltcGxpY2l0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wbGljaXQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2lzSW1wbGljaXQoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxpY2l0KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpDQotCSAqIEBzZWUgI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlYiBNZXRob2RzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRXZWJNZXRob2RzKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBVc2U8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQHNlZSAjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBNZXRob2Q8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViTWV0aG9kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMgPGVtPlBhcmFtZXRlcnM8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBhcmFtZXRlcnM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFBhcmFtZXRlcnMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZWQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdVc2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViTWV0aG9kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2QjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBzZWUgI2dldElXZWJNZXRob2QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQ2xhc3MgZ2V0SVdlYlBhcmFtKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldEtpbmQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9LaW5kKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFR5cGVOYW1lIDxlbT5UeXBlIE5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE5hbWU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UeXBlTmFtZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2dldFBhcnROYW1lKCkNCi0JICogQHNlZSAjZ2V0SVdlYlBhcmFtKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAc2VlICNnZXRJV2ViUGFyYW0oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJQYXJhbV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jaXNIZWFkZXIgPGVtPkhlYWRlcjwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlYWRlcjwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNpc0hlYWRlcigpDQotCSAqIEBzZWUgI2dldElXZWJQYXJhbSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSA8ZW0+SVdlYiBTZXJ2aWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRTZXJ2aWNlRW5kcG9pbnQoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBzZWUgI2dldElXZWJTZXJ2aWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9ydCBOYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRXc2RsTG9jYXRpb24gPGVtPldzZGwgTG9jYXRpb248L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xc2RsIExvY2F0aW9uPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UjZ2V0V3NkbExvY2F0aW9uKCkNCi0JICogQHNlZSAjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QgPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdCNnZXRXZWJTZXJ2aWNlcyA8ZW0+V2ViIFNlcnZpY2VzPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XZWIgU2VydmljZXM8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3QjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFUmVmZXJlbmNlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0I2dldE5hbWUoKQ0KLQkgKiBAc2VlICNnZXRJV2ViU2VydmljZVByb2plY3QoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlIDxlbT5JV2ViIFR5cGU8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUNsYXNzIGdldElXZWJUeXBlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kIDxlbT5XZWIgUGFyYW0gS2luZDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPldlYiBQYXJhbSBLaW5kPC9lbT4nLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFdlYlBhcmFtS2luZCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUgPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBTdHlsZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JRUVudW0gZ2V0U09BUEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+U09BUCBCaW5kaW5nIFVzZTwvZW0+Jy4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNPQVAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUVFbnVtIGdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCURvbUZhY3RvcnkgZ2V0RG9tRmFjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudA0KLQkgKiA8dWw+DQotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4NCi0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+DQotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+DQotCSAqIDwvdWw+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgew0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSURPTUltcGwgPGVtPklET008L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRJRE9NKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElET00gPSBlSU5TVEFOQ0UuZ2V0SURPTSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2UgUHJvamVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMgPSBlSU5TVEFOQ0UuZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTiA9IGVJTlNUQU5DRS5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50X0ltcGxlbWVudGF0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfTmFtZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwgPGVtPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxpY2l0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGljaXQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkltcGxlbWVudGluZyBXZWIgU2VydmljZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfSW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9XZWJNZXRob2RzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9UYXJnZXROYW1lc3BhY2UoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UgPSBlSU5TVEFOQ0UuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFID0gZUlOU1RBTkNFLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwgPGVtPklXZWIgTWV0aG9kPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYk1ldGhvZCgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfTUVUSE9EX19QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldElXZWJNZXRob2RfUGFyYW1ldGVycygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19FWENMVURFRCA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX0V4Y2x1ZGVkKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSA9IGVJTlNUQU5DRS5nZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwgPGVtPklXZWIgUGFyYW08L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViUGFyYW1JbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJQYXJhbSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVDbGFzcyBJV0VCX1BBUkFNID0gZUlOU1RBTkNFLmdldElXZWJQYXJhbSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9QQVJBTV9fS0lORCA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fS2luZCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJ0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1BBUlRfTkFNRSA9IGVJTlNUQU5DRS5nZXRJV2ViUGFyYW1fUGFydE5hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1BBUkFNX19IRUFERVIgPSBlSU5TVEFOQ0UuZ2V0SVdlYlBhcmFtX0hlYWRlcigpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsIDxlbT5JV2ViIFNlcnZpY2U8L2VtPn0nIGNsYXNzLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2UoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQ2xhc3MgSVdFQl9TRVJWSUNFID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRVJlZmVyZW5jZSBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3J0IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFQXR0cmlidXRlIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlX1BvcnROYW1lKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xc2RsIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUF0dHJpYnV0ZSBJV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VfV3NkbExvY2F0aW9uKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsIDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScgY2xhc3MuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0SVdlYlNlcnZpY2VQcm9qZWN0KCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfU0VSVklDRV9QUk9KRUNUID0gZUlOU1RBTkNFLmdldElXZWJTZXJ2aWNlUHJvamVjdCgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2ViIFNlcnZpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFUmVmZXJlbmNlIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVSZWZlcmVuY2UgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUyA9IGVJTlNUQU5DRS5nZXRJV2ViU2VydmljZVByb2plY3RfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuDQotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVBdHRyaWJ1dGUgSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X05hbWUoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJUeXBlSW1wbCA8ZW0+SVdlYiBUeXBlPC9lbT59JyBjbGFzcy4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlR5cGVJbXBsDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldElXZWJUeXBlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUNsYXNzIElXRUJfVFlQRSA9IGVJTlNUQU5DRS5nZXRJV2ViVHlwZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQgPGVtPldlYiBQYXJhbSBLaW5kPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZA0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5Eb21QYWNrYWdlSW1wbCNnZXRXZWJQYXJhbUtpbmQoKQ0KLQkJICogQGdlbmVyYXRlZA0KLQkJICovDQotCQlFRW51bSBXRUJfUEFSQU1fS0lORCA9IGVJTlNUQU5DRS5nZXRXZWJQYXJhbUtpbmQoKTsNCi0NCi0JCS8qKg0KLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZSA8ZW0+U09BUCBCaW5kaW5nIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19TVFlMRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1N0eWxlKCk7DQotDQotCQkvKioNCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlIDxlbT5TT0FQIEJpbmRpbmcgVXNlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLkRvbVBhY2thZ2VJbXBsI2dldFNPQVBCaW5kaW5nVXNlKCkNCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJRUVudW0gU09BUF9CSU5ESU5HX1VTRSA9IGVJTlNUQU5DRS5nZXRTT0FQQmluZGluZ1VzZSgpOw0KLQ0KLQkJLyoqDQotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBlbnVtLg0KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuRG9tUGFja2FnZUltcGwjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCQkgKiBAZ2VuZXJhdGVkDQotCQkgKi8NCi0JCUVFbnVtIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUgPSBlSU5TVEFOQ0UuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JRE9NLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU5NGE4OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSURPTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICoNCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00jZ2V0V2ViU2VydmljZVByb2plY3RzIDxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJRE9NKCkNCi0gKiBAbW9kZWwNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGludGVyZmFjZSBJRE9NIGV4dGVuZHMgRU9iamVjdCB7DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgU2VydmljZSBQcm9qZWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuDQotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgU2VydmljZSBQcm9qZWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKQ0KLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpOw0KLQ0KLX0gLy8gSURPTQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lKYXZhV2ViU2VydmljZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjEyMDBmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqICAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhV2ViU2VydmljZUVsZW1lbnQgZXh0ZW5kcyBFT2JqZWN0DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1ODlkMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0Ow0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpOw0KLQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgY29udGFpbm1lbnQ9ImZhbHNlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViU2VydmljZSIgb3Bwb3NpdGU9InNlcnZpY2VFbmRwb2ludCINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiBtYW55PSJ0cnVlIiB0eXBlPSJJV2ViTWV0aG9kIg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpOw0KLQkNCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRE9DVU1FTlQiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iRE9DVU1FTlQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMSVRFUkFMIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJMSVRFUkFMIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU09BUEJpbmRpbmdVc2UgZ2V0U29hcEJpbmRpbmdVc2UoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iV1JBUFBFRCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IldSQVBQRUQiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHZhbHVlKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXU0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhMzljYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdTRE9NUnVudGltZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLQ0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSVdTRE9NUnVudGltZU1hbmFnZXINCi17DQotCS8qKg0KLQkgKiBJbnN0YW50aWF0ZXMgdGhlIERPTSBSdW50aW1lcyBpZiBub3QgYWxyZWFkeS4NCi0JICogQHBhcmFtIHByb2dyZXNzIG1vbml0b3IgdG8gdHJhY2sgcHJvZ3Jlc3MgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET01SdW50aW1lcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bnRpbWUgaWQNCi0JICogYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIC0gc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHJ1bnRpbWUgDQotCSAqIEByZXR1cm4gdGhlIERPTSBydW50aW1lIGluc3RhbmNlLiBOdWxsIGlmIHJ1bnRpbWUgd2l0aCBzdWNoIGlkIGlzIG5vdCByZWdpc3RlcmVkDQotCSAqLw0KLQlwdWJsaWMgIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShTdHJpbmcgcnVudGltZUlkKTsNCi0JDQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIERPTSBSdW50aW1lcyBjdXJyZW50bHkgaW5zdGFudGlhdGVkDQotCSAqLw0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBnZXRET01SdW50aW1lcygpOw0KLQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbG9hZERPTVJ1bnRpbWVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDcwZDM4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViTWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJNZXRob2QgZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9IklXZWJQYXJhbSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIHR5cGU9ImJvb2xlYW4iIG1hbnk9ImZhbHNlIiBjaGFuZ2VhYmxlPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSINCi0JICovDQotCWJvb2xlYW4gaXNFeGNsdWRlZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2lzRXhjbHVkZWQgPGVtPkV4Y2x1ZGVkPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzRXhjbHVkZWQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJET0NVTUVOVCI8L2NvZGU+Lg0KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZQ0KLQkgKiBAc2VlICNzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBCaW5kaW5nU3R5bGUpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJET0NVTUVOVCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nU3R5bGUgPGVtPlNvYXAgQmluZGluZyBTdHlsZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGUNCi0JICogQHNlZSAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvYXAgQmluZGluZyBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxJVEVSQUwiPC9jb2RlPi4NCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI3NldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nVXNlKCkNCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxJVEVSQUwiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nVXNlIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlDQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nVXNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1VzZShTT0FQQmluZGluZ1VzZSB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJXUkFQUEVEIjwvY29kZT4uDQotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUNCi0JICogQHNlZSAjc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAbW9kZWwgZGVmYXVsdD0iV1JBUFBFRCIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViUGFyYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzY5NmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJQYXJhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0vKioNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICogQG1vZGVsDQotICovDQotcHVibGljIGludGVyZmFjZSBJV2ViUGFyYW0gZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50DQotew0KLQkvKioNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBtYW55PSJmYWxzZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiDQotCSAqIEByZXR1cm4NCi0JICovDQotCVN0cmluZyBnZXRUeXBlTmFtZSgpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydCBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRQYXJ0TmFtZShTdHJpbmcpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlI2dldElXZWJQYXJhbV9QYXJ0TmFtZSgpDQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSINCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JU3RyaW5nIGdldFBhcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRQYXJ0TmFtZSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UGFydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbSNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQl2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgdmFsdWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVhZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGVhZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IZWFkZXI8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNzZXRIZWFkZXIoYm9vbGVhbikNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0SVdlYlBhcmFtX0hlYWRlcigpDQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCWJvb2xlYW4gaXNIZWFkZXIoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtI2lzSGVhZGVyIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlYWRlcjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0Jdm9pZCBzZXRIZWFkZXIoYm9vbGVhbiB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iV2ViUGFyYW1LaW5kIiByZXF1aXJlZD0idHJ1ZSIgbWFueT0iZmFsc2UiDQotCSAqLw0KLQlXZWJQYXJhbUtpbmQgZ2V0S2luZCgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0jZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQNCi0JICogQHNlZSAjZ2V0S2luZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0S2luZChXZWJQYXJhbUtpbmQgdmFsdWUpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjAxMWZlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudCANCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG9wcG9zaXRlPSJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQ0KLQkvKioNCi0JICogQG1vZGVsIGNoYW5nZWFibGU9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB2YWx1ZSk7DQotDQotCS8qKg0KLQkgKiBAbW9kZWwgY2hhbmdlYWJsZT0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCk7DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZSNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWU8L2VtPicgYXR0cmlidXRlLg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0UG9ydE5hbWUoU3RyaW5nIHZhbHVlKTsNCi0NCi0JLyoqDQotCSAqIEBtb2RlbCBjaGFuZ2VhYmxlPSJ0cnVlIiBzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eT0idHJ1ZSINCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V3NkbExvY2F0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuDQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyB2YWx1ZSk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJTZXJ2aWNlUHJvamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MWQ1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdlYlNlcnZpY2VQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJTZXJ2aWNlUHJvamVjdCBleHRlbmRzIEVPYmplY3QNCi17DQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVdlYlNlcnZpY2UiIHN1cHByZXNzZWRTZXRWaXNpYmlsaXR5PSJ0cnVlIiBtYW55PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSINCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElXZWJTZXJ2aWNlPiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgdHlwZT0iSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIG1hbnk9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIEVMaXN0PElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKTsNCi0JDQotCS8qKg0KLQkgKiBAbW9kZWwgc3VwcHJlc3NlZFNldFZpc2liaWxpdHk9InRydWUiIHJlcXVpcmVkPSJ0cnVlIg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV2ViVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MzRkYTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXZWJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotDQotLyoqDQotICogQG1vZGVsDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXZWJUeXBlICBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnQgew0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRE9NUnVudGltZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMmI4MDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL0lXc0RPTVJ1bnRpbWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotDQotDQotLyoqDQotICogVGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGFsbCBydW50aW1lIHdoaWNoIHdhbnQgdG8gaGF2ZSBET00gVHJlZSANCi0gKiByZXByZXNlbnRhdGlvbiBvbiB0b3Agb2YgdGhlbS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gDQotew0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbnRpYXRlIHRoZSBET00gaW5zdGFuY2UgZm9yIHRoZSBydW50aW1lIGFuZCBsb2FkcyB0aGUNCi0JICogZGF0YSBpbnRvIGl0LiBUaGUgbWV0aG9kIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCBkdXJpbmcgZXhlY3V0aW9uLiBJZiB5b3UgY2FsbCB0aGlzDQotCSAqIG1ldGhvZCBkdXJpbmcgbG9hZGluZyAoaS5lLiBzb21lYm9keSBhbHJlYWR5IGNhbGxlZCBpdCBpbiBkaWZmZXJlbnQgdGhyZWFkKSB0aGUgbWV0aG9kIA0KLQkgKiB3aWxsIGJsb2NrIHVudGlsIHRoZSBsb2FkIGZpbmlzaGVzIGluc3RlYWQgb2YgdHJpZ2dlcmluZyBET00gcmVsb2FkLiANCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBkdXJpbmcgbG9hZGluZywgY2FuY2VsbGluZyB0aGUgbG9hZCB2aWEgbW9uaXRvciBpcyBzdXBwb3J0ZWQNCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIHRoZSBET00gbG9hZGluZyBpcyBub3QgYWJsZSB0byByZWFkIHJlcXVpcmVkIGRhdGENCi0JICogQHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBsb2FkaW5nIHdhcyBjYW5jZWxsZWQgdmlhIHByb3ZpZGVkIA0KLQkgKiA8Y29kZT5tb25pdG9yPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyB2b2lkIGNyZWF0ZURPTShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogQWRkcyBhIGxvYWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgaW4gbG9hZCBldmVudHMuIEluIGNhc2UgdGhlIGxvYWRpbmcgaGFzIGFscmVhZHkgYmVlbiBzdGFydGVkIA0KLQkgKiB0aGlzIGxpc3RlbmVyJ3MgbWV0aG9kcyBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9hZC4NCi0JICoge0BsaW5rIElXc0RvbUxvYWRMaXN0ZW5lciNmaW5pc2hlZCgpfSBtZXRob2QgaXMgY2FsbGVkIGluIGFueSBjYXNlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsb2FkaW5nDQotCSAqIGhhcyBiZWVuIGNhbmNlbGxlZCBvciBub3QuIA0KLQkgKiBAcGFyYW0gbGlzdGVuZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExvYWRMaXN0ZW5lcihJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIpOw0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlIGxpc3RlbmVyIGZyb20gRE9NIGxvYWRpbmcgbGlzdGVuZXJzIGxpc3QNCi0JICogDQotCSAqIEBwYXJhbSBsaXN0ZW5lcg0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcik7DQotCQ0KLQkvKioNCi0JICogVG8gZ2V0IGEgaGFuZGxlIHRvIHRoZSBET00gaW5zdGFuY2UgYXZhaWxhYmxlIGZvciB0aGlzIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZGluZyB3YXMgbm90IHN0YXJ0ZWQgeWV0IG9yDQotCSAqIGlzIG5vdCBmaW5pc2hlZCB5ZXQuDQotCSAqIEB0aHJvd3MgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbGxlZCBhbHJlYWR5IGJ1dCB0aGUgbG9hZA0KLQkgKiBoYXMgYmVlbiBjYW5jZWxsZWQNCi0JICovDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvSVdzRG9tTG9hZExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODc5YjA0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9JV3NEb21Mb2FkTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi0NCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgaW50ZXJlc3RlZCBpbiBET00gbG9hZCBwcm9jZXNzLiBJbXBsZW1lbnRvcnMgY2FuIGJlIGFkZGVkIHRvDQotICogdGhlIHtAbGluayBJV3NET01SdW50aW1lRXh0ZW5zaW9ufSB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgb24gbG9hZCBzdGFydHVwL2ZpbmlzaCAgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdzRG9tTG9hZExpc3RlbmVyIA0KLXsNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0ganVzdCBiZWZvcmUgdGhlIERPTSBsb2FkIHN0YXJ0IA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCBieSB7QGxpbmsgSVdzRE9NUnVudGltZUV4dGVuc2lvbn0gd2hlbiB0aGUgRE9NIGxvYWQgaGFzIGZpbmlzaGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpOwkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NTY4NTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPldSQVBQRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRF9WQUxVRQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlXUkFQUEVEKDAsICJXUkFQUEVEIiwgIldSQVBQRUQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0JBUkVfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JQkFSRSgxLCAiQkFSRSIsICJCQVJFIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V1JBUFBFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjV1JBUFBFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV1JBUFBFRF9WQUxVRSA9IDA7DQotDQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5CQVJFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNCQVJFDQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCQVJFX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXSBWQUxVRVNfQVJSQVkgPQ0KLQkJbmV3IFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVbXQ0KLQkJew0KLQkJCVdSQVBQRUQsDQotCQkJQkFSRSwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFBhcmFtZXRlciBTdHlsZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgV1JBUFBFRF9WQUxVRTogcmV0dXJuIFdSQVBQRUQ7DQotCQkJY2FzZSBCQVJFX1ZBTFVFOiByZXR1cm4gQkFSRTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7DQotCSAgcmV0dXJuIHZhbHVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkgIHJldHVybiBuYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQkNCi19IC8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1NPQVBCaW5kaW5nU3R5bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA4MjI1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1N0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlNPQVAgQmluZGluZyBTdHlsZTwvYj48L2VtPicsDQotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UjZ2V0U09BUEJpbmRpbmdTdHlsZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nU3R5bGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsNCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0RPQ1VNRU5UX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCURPQ1VNRU5UKDAsICJET0NVTUVOVCIsICJET0NVTUVOVCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPlJQQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNSUENfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JUlBDKDEsICJSUEMiLCAiUlBDIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RE9DVU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRPQ1VNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwNCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLg0KLQkgKiA8L3A+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNET0NVTUVOVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+UlBDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SUEM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI1JQQw0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlBDX1ZBTFVFID0gMTsNCi0NCi0JLyoqDQotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdTdHlsZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdTdHlsZVtdDQotCQl7DQotCQkJRE9DVU1FTlQsDQotCQkJUlBDLA0KLQkJfTsNCi0NCi0JLyoqDQotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFNPQVBCaW5kaW5nU3R5bGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldChTdHJpbmcgbGl0ZXJhbCkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFN0eWxlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1N0eWxlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpDQotCQl7DQotCQkJU09BUEJpbmRpbmdTdHlsZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgU3R5bGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIERPQ1VNRU5UX1ZBTFVFOiByZXR1cm4gRE9DVU1FTlQ7DQotCQkJY2FzZSBSUENfVkFMVUU6IHJldHVybiBSUEM7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsNCi0NCi0JLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgU09BUEJpbmRpbmdTdHlsZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nU3R5bGUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvU09BUEJpbmRpbmdVc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjM1YjE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9TT0FQQmluZGluZ1VzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JywNCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNnZXRTT0FQQmluZGluZ1VzZSgpDQotICogQG1vZGVsDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBlbnVtIFNPQVBCaW5kaW5nVXNlIGltcGxlbWVudHMgRW51bWVyYXRvciB7DQotCS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5MSVRFUkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUxfVkFMVUUNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JTElURVJBTCgwLCAiTElURVJBTCIsICJMSVRFUkFMIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNFTkNPREVEX1ZBTFVFDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCUVOQ09ERUQoMSwgIkVOQ09ERUQiLCAiRU5DT0RFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JLyoqDQotCSAqIFRoZSAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDxwPg0KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxJVEVSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0xJVEVSQUwNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVEVSQUxfVkFMVUUgPSAwOw0KLQ0KLQkvKioNCi0JICogVGhlICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5DT0RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjRU5DT0RFRA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFRF9WQUxVRSA9IDE7DQotDQotCS8qKg0KLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1VzZVtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgU09BUEJpbmRpbmdVc2VbXQ0KLQkJew0KLQkJCUxJVEVSQUwsDQotCQkJRU5DT0RFRCwNCi0JCX07DQotDQotCS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgZW51bWVyYXRvcnMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8U09BUEJpbmRpbmdVc2U+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkNCi0JCQl7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+U09BUCBCaW5kaW5nIFVzZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU09BUEJpbmRpbmdVc2UgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5TT0FQIEJpbmRpbmcgVXNlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTT0FQQmluZGluZ1VzZSBnZXQoaW50IHZhbHVlKSB7DQotCQlzd2l0Y2ggKHZhbHVlKQ0KLQkJew0KLQkJCWNhc2UgTElURVJBTF9WQUxVRTogcmV0dXJuIExJVEVSQUw7DQotCQkJY2FzZSBFTkNPREVEX1ZBTFVFOiByZXR1cm4gRU5DT0RFRDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOw0KLQ0KLQkvKioNCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTT0FQQmluZGluZ1VzZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5uYW1lID0gbmFtZTsNCi0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KLQkgIHJldHVybiB2YWx1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsNCi0JICByZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0JDQotfSAvL1NPQVBCaW5kaW5nVXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9hcGkvV2ViUGFyYW1LaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDkyNjQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9XZWJQYXJhbUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOw0KLQ0KLS8qKg0KLSAqIEBtb2RlbA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICoNCi0gKi8NCi1wdWJsaWMgZW51bSBXZWJQYXJhbUtpbmQgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsvKipAbW9kZWwqL0lOKDAsICJJTiIsICJJTiIpLCAvKipAbW9kZWwqL0lOT1VUKDEsICJJTk9VVCIsICJJTk9VVCIpLCAvKipAbW9kZWwqL09VVCgyLCAiT1VUIiwgIk9VVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JA0KLQ0KLS8qKg0KLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPHA+DQotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI0lODQotCSAqIEBtb2RlbA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9WQUxVRSA9IDA7DQotLyoqDQotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsDQotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4NCi0JICogPC9wPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjSU5PVVQNCi0JICogQG1vZGVsDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOT1VUX1ZBTFVFID0gMTsNCi0vKioNCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8cD4NCi0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLA0KLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uDQotCSAqIDwvcD4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI09VVA0KLQkgKiBAbW9kZWwNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX1ZBTFVFID0gMjsNCi0vKioNCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZFtdIFZBTFVFU19BUlJBWSA9DQotCQluZXcgV2ViUGFyYW1LaW5kW10NCi0JCXsNCi0JCQlJTiwNCi0JCQlJTk9VVCwNCi0JCQlPVVQsDQotCQl9Ow0KLS8qKg0KLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdlYlBhcmFtS2luZD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOw0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkNCi0JCXsNCi0JCQlXZWJQYXJhbUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOw0KLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V2ViIFBhcmFtIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFdlYlBhcmFtS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQ0KLQkJew0KLQkJCVdlYlBhcmFtS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07DQotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldlYiBQYXJhbSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBXZWJQYXJhbUtpbmQgZ2V0KGludCB2YWx1ZSkgew0KLQkJc3dpdGNoICh2YWx1ZSkNCi0JCXsNCi0JCQljYXNlIElOX1ZBTFVFOiByZXR1cm4gSU47DQotCQkJY2FzZSBJTk9VVF9WQUxVRTogcmV0dXJuIElOT1VUOw0KLQkJCWNhc2UgT1VUX1ZBTFVFOiByZXR1cm4gT1VUOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOw0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7DQotDQotLyoqDQotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgV2ViUGFyYW1LaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCQl0aGlzLm5hbWUgPSBuYW1lOw0KLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsNCi0JICByZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0vKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JICByZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgew0KLQkgIHJldHVybiBsaXRlcmFsOw0KLQl9DQotDQotLyoqDQotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBsaXRlcmFsOw0KLQl9fQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NzEwNDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotDQotDQotLyoqDQotICogRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIHRoZSBsb2FkaW5nIG9mIFdTIERPTSBoYXMgYmVlbiBjYW5jZWxsZWQNCi0gKiAgDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBleGNlcHRpb24gd2l0aCBhYmlsaXR5IHRvIHByb3ZpZGUgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRMb2NhbGl6ZWRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIC0gaW4gY2FzZSBsb2NhbGlzZWQgbWVzc2FnZSBpcyBudWxsDQotCSAqICovDQotCXB1YmxpYyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpIHsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsNCi0JCXJldHVybiBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvYXBpL1dzRE9NUnVudGltZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZkNGE2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2FwaS9Xc0RPTVJ1bnRpbWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnkuSVdzRE9NUnVudGltZUluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeS5Xc0RPTVJ1bnRpbWVSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgY2xhc3MgZm9yIGluc3RhbnRpYXRpbmcgRE9NIFJ1bnRpbWVzIGFuZCBtYW5hZ2luZyB0aG9zZSBpbnN0YW5jZXMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgSHJpc3Rvdg0KLSAqDQotICovDQotcHVibGljIGNsYXNzIFdzRE9NUnVudGltZU1hbmFnZXIgaW1wbGVtZW50cyBJV1NET01SdW50aW1lTWFuYWdlcg0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgV3NET01SdW50aW1lTWFuYWdlciBpbnN0YW5jZSA9IG5ldyBXc0RPTVJ1bnRpbWVNYW5hZ2VyKCk7DQotDQotCXByaXZhdGUgTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPiBkb21SdW50aW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJV3NET01SdW50aW1lRXh0ZW5zaW9uPigpOw0KLQ0KLQlwcm90ZWN0ZWQgV3NET01SdW50aW1lTWFuYWdlcigpDQotCXsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIElXU0RPTVJ1bnRpbWVNYW5hZ2VyIGluc3RhbmNlKCkNCi0Jew0KLQkJcmV0dXJuIGluc3RhbmNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEluc3RhbnRpYXRlcyB0aGUgRE9NIFJ1bnRpbWVzIGlmIG5vdCBhbHJlYWR5Lg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNyZWF0ZURPTVJ1bnRpbWVzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0Jew0KLQkJZm9yIChJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbyA6IFdzRE9NUnVudGltZVJlZ2lzdHJ5LmdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKSkgew0KLQkJCWNyZWF0ZURPTVJ1bnRpbWUocnVudGltZUluZm8sIG1vbml0b3IpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBjcmVhdGVET01SdW50aW1lKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCWZpbmFsIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZG9tUnVudGltZSA9IGdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotCQkNCi0JCXRyeSB7DQotCQkJZG9tUnVudGltZS5jcmVhdGVET00obW9uaXRvcik7DQotCQl9IA0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiB1bmV4cGVjdGVkKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuZXhwZWN0ZWQgRXhjZXB0aW9uISBEb20gZnJvbSBydW50aW1lICIgKyBydW50aW1lSW5mby5nZXROYW1lKCkgKyAiIHdpbGwgbm90IGJlIHByb2Nlc3NlZCEiLCB1bmV4cGVjdGVkKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3QNCi0JICogb2YgdHlwZSBJUnVudGltZUluZm8gYW5kIGluc3RhbnRpYXRlIHN1Y2ggRE9NIHJ1bnRpbWUgaW5zdGFuY2UgaWYgbm9uIGV4aXN0ZW50IGF0IHRoZSANCi0JICogbW9tZW50IG9mIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUluZm8gLSBkZXNjcmlwdG9yIG9mIHRoZSBET00gcnVudGltZSB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkIA0KLQkgKiBAcmV0dXJuIHRoZSBET00gcnVudGltZSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24gZ2V0RE9NUnVudGltZShmaW5hbCBJV3NET01SdW50aW1lSW5mbyBydW50aW1lSW5mbykNCi0Jew0KLQkJaWYgKHJ1bnRpbWVJbmZvID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBkb21SdW50aW1lID0gZG9tUnVudGltZXMuZ2V0KHJ1bnRpbWVJbmZvLmdldElkKCkpOwkJDQotCQlpZiAoZG9tUnVudGltZSA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbVJ1bnRpbWUgPSBXc0RPTVJ1bnRpbWVSZWdpc3RyeS5pbnN0YW50aWF0ZVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCWlmIChkb21SdW50aW1lICE9IG51bGwpIHsNCi0JCQkJc3luY2hyb25pemVkKGRvbVJ1bnRpbWVzKSB7DQotCQkJCQlkb21SdW50aW1lcy5wdXQocnVudGltZUluZm8uZ2V0SWQoKSwgZG9tUnVudGltZSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBkb21SdW50aW1lOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgcnVudGltZSBpZA0KLQkgKiBhbmQgaW5zdGFudGlhdGUgc3VjaCBET00gcnVudGltZSBpbnN0YW5jZSBpZiBub24gZXhpc3RlbnQgYXQgdGhlIA0KLQkgKiBtb21lbnQgb2YgaW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZC4NCi0JICogDQotCSAqIEBwYXJhbSBydW50aW1lSWQgLSBzdHJpbmcgaWRlbnRpZmllciBvZiB0aGUgcnVudGltZSANCi0JICogQHJldHVybiB0aGUgRE9NIHJ1bnRpbWUgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldERPTVJ1bnRpbWUoZmluYWwgU3RyaW5nIHJ1bnRpbWVJZCkNCi0Jew0KLQkJcmV0dXJuIGdldERPTVJ1bnRpbWUoV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UnVudGltZUluZm8ocnVudGltZUlkKSk7DQotCX0NCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiANCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIGluc3RhbnRpYXRlZCBET00gUnVudGltZXMNCi0gICAgICovDQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+IGdldERPTVJ1bnRpbWVzKCkNCi0gICAgew0KLSAgICAJaWYgKGRvbVJ1bnRpbWVzLnNpemUoKSA9PSAwKSANCi0gICAgCXsNCi0JICAgIAlmaW5hbCBDb2xsZWN0aW9uPElXc0RPTVJ1bnRpbWVJbmZvPiBydEluZm9zID0gV3NET01SdW50aW1lUmVnaXN0cnkuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzSW5mbygpOw0KLQkgICAgCWZvciAoSVdzRE9NUnVudGltZUluZm8gcnVudGltZUluZm8gOiBydEluZm9zKSB7DQotCQkJCWdldERPTVJ1bnRpbWUocnVudGltZUluZm8pOw0KLQkJCX0NCi0gICAgCX0NCi0gICAgCQ0KLSAgICAJcmV0dXJuIGRvbVJ1bnRpbWVzLnZhbHVlcygpOw0KLSAgICB9DQotCQ0KLQkvKioNCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHJlbG9hZCBhbGwgaW5zdGFuY2VzIG9mIERPTSBSdW50aW1lcy4NCi0JICoNCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxvYWRET01SdW50aW1lcyhmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCXsNCi0JCXN5bmNocm9uaXplZChkb21SdW50aW1lcykgew0KLQkJCWRvbVJ1bnRpbWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLElXc0RPTVJ1bnRpbWVFeHRlbnNpb24+KCk7DQotCQl9DQotCQkNCi0JCWNyZWF0ZURPTVJ1bnRpbWVzKG1vbml0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgSUxvZ2dlciBsb2dnZXIoKSB7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwNDFlZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0iZG9tIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20uZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklET00iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWJTZXJ2aWNlUHJvamVjdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2VQcm9qZWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxlbWVudGF0aW9uIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGxpY2l0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGxlbWVudGluZ1dlYlNlcnZpY2VzIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lXZWJTZXJ2aWNlIiBlT3Bwb3NpdGU9IiMvL0lXZWJTZXJ2aWNlL3NlcnZpY2VFbmRwb2ludCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlYk1ldGhvZHMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYk1ldGhvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1N0eWxlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU09BUEJpbmRpbmdTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iRE9DVU1FTlQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic29hcEJpbmRpbmdVc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1VzZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTElURVJBTCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iV1JBUFBFRCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJV2ViTWV0aG9kIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlcnMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vSVdlYlBhcmFtIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZWQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nU3R5bGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TT0FQQmluZGluZ1N0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJET0NVTUVOVCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb2FwQmluZGluZ1VzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NPQVBCaW5kaW5nVXNlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMSVRFUkFMIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJXUkFQUEVEIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJQYXJhbSIgZVN1cGVyVHlwZXM9IiMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJraW5kIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vV2ViUGFyYW1LaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGVOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFydE5hbWUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFyZ2V0TmFtZXNwYWNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhlYWRlciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklXZWJTZXJ2aWNlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlcnZpY2VFbmRwb2ludCIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ic3VwcHJlc3NlZFNldFZpc2liaWxpdHkiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwb3J0TmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3c2RsTG9jYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2ViU2VydmljZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSVdlYlNlcnZpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9InN1cHByZXNzZWRTZXRWaXNpYmlsaXR5IiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJzdXBwcmVzc2VkU2V0VmlzaWJpbGl0eSIgdmFsdWU9InRydWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSVdlYlR5cGUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJXZWJQYXJhbUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOT1VUIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iT1VUIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlNPQVBCaW5kaW5nU3R5bGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRE9DVU1FTlQiIGxpdGVyYWw9IkRPQ1VNRU5UIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSUEMiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iU09BUEJpbmRpbmdVc2UiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTElURVJBTCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iRU5DT0RFRCIgdmFsdWU9IjEiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IldSQVBQRUQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkJBUkUiIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLndzLmdlbm1vZGVsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0MjY5YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9kb20ud3MuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMiIGVkaXRvckRpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIiBtb2RlbE5hbWU9IkRvbSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaSIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5uYXZpZ2F0b3IuZ2VuZXJhdGVkLkRvbUVkaXRvclBsdWdpbiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiB0ZXN0c0RpcmVjdG9yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzL3NyYyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIuamF2YSIgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiCi0gICAgcHJvdmlkZXJSb290RXh0ZW5kc0NsYXNzPSIiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJEb20iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBpbnRlcmZhY2VQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgbWV0YURhdGFQYWNrYWdlU3VmZml4PSJydW50aW1lLmFwaSIgY2xhc3NQYWNrYWdlU3VmZml4PSJydW50aW1lLmludGVybmFsLmltcGwiCi0gICAgICB1dGlsaXR5UGFja2FnZVN1ZmZpeD0icnVudGltZS51dGlsIiBwcm92aWRlclBhY2thZ2VTdWZmaXg9InVpIiBnZW5lcmF0ZUV4YW1wbGVDbGFzcz0iZmFsc2UiCi0gICAgICBlY29yZVBhY2thZ2U9ImRvbS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vV2ViUGFyYW1LaW5kL0lOIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1dlYlBhcmFtS2luZC9JTk9VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9XZWJQYXJhbUtpbmQvT1VUIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nU3R5bGUvRE9DVU1FTlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdTdHlsZS9SUEMiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1VzZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nVXNlL0xJVEVSQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdVc2UvRU5DT0RFRCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImRvbS5lY29yZSMvL1NPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJkb20uZWNvcmUjLy9TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlL1dSQVBQRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZG9tLmVjb3JlIy8vU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS9CQVJFIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JRE9NIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSURPTS93ZWJTZXJ2aWNlUHJvamVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSUphdmFXZWJTZXJ2aWNlRWxlbWVudC9pbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lKYXZhV2ViU2VydmljZUVsZW1lbnQvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL2ltcGxpY2l0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS9pbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3dlYk1ldGhvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdTdHlsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Uvc29hcEJpbmRpbmdVc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlL3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYk1ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvcGFyYW1ldGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRvbS5lY29yZSMvL0lXZWJNZXRob2QvZXhjbHVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nU3R5bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViTWV0aG9kL3NvYXBCaW5kaW5nVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYk1ldGhvZC9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRvbS5lY29yZSMvL0lXZWJQYXJhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdHlwZU5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vcGFydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViUGFyYW0vdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlBhcmFtL2hlYWRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkb20uZWNvcmUjLy9JV2ViU2VydmljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2Uvc2VydmljZUVuZHBvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2UvcG9ydE5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkb20uZWNvcmUjLy9JV2ViU2VydmljZS93c2RsTG9jYXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L3dlYlNlcnZpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRvbS5lY29yZSMvL0lXZWJTZXJ2aWNlUHJvamVjdC9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZG9tLmVjb3JlIy8vSVdlYlNlcnZpY2VQcm9qZWN0L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZG9tLmVjb3JlIy8vSVdlYlR5cGUiLz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MWQzYTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9Eb21GYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotDQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBEb21GYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERvbUZhY3Rvcnkgew0KLQkvKioNCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBEb21GYWN0b3J5IGluaXQoKSB7DQotCQl0cnkNCi0JCXsNCi0JCQlEb21GYWN0b3J5IHRoZURvbUZhY3RvcnkgPSAoRG9tRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgDQotCQkJaWYgKHRoZURvbUZhY3RvcnkgIT0gbnVsbCkNCi0JCQl7DQotCQkJCXJldHVybiB0aGVEb21GYWN0b3J5Ow0KLQkJCX0NCi0JCX0NCi0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQ0KLQkJew0KLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBEb21GYWN0b3J5SW1wbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIERvbUZhY3RvcnlJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgew0KLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET006IHJldHVybiBjcmVhdGVJRE9NKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6IHJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRTogcmV0dXJuIGNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0Q6IHJldHVybiBjcmVhdGVJV2ViTWV0aG9kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06IHJldHVybiBjcmVhdGVJV2ViUGFyYW0oKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOiByZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1Q6IHJldHVybiBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9UWVBFOiByZXR1cm4gY3JlYXRlSVdlYlR5cGUoKTsNCi0JCQlkZWZhdWx0Og0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLldFQl9QQVJBTV9LSU5EOg0KLQkJCQlyZXR1cm4gY3JlYXRlV2ViUGFyYW1LaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nU3R5bGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBjcmVhdGVTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7DQotCQkJZGVmYXVsdDoNCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5XRUJfUEFSQU1fS0lORDoNCi0JCQkJcmV0dXJuIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdTdHlsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLlNPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBjb252ZXJ0U09BUEJpbmRpbmdVc2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gY29udmVydFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOw0KLQkJCWRlZmF1bHQ6DQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElET00gY3JlYXRlSURPTSgpIHsNCi0JCUlET01JbXBsIGlkb20gPSBuZXcgSURPTUltcGwoKTsNCi0JCXJldHVybiBpZG9tOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElKYXZhV2ViU2VydmljZUVsZW1lbnQgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudCgpIHsNCi0JCUlKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSBuZXcgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwoKTsNCi0JCXJldHVybiBpSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPSBuZXcgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKTsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJNZXRob2QgY3JlYXRlSVdlYk1ldGhvZCgpIHsNCi0JCUlXZWJNZXRob2RJbXBsIGlXZWJNZXRob2QgPSBuZXcgSVdlYk1ldGhvZEltcGwoKTsNCi0JCXJldHVybiBpV2ViTWV0aG9kOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJQYXJhbSBjcmVhdGVJV2ViUGFyYW0oKSB7DQotCQlJV2ViUGFyYW1JbXBsIGlXZWJQYXJhbSA9IG5ldyBJV2ViUGFyYW1JbXBsKCk7DQotCQlyZXR1cm4gaVdlYlBhcmFtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlIGNyZWF0ZUlXZWJTZXJ2aWNlKCkgew0KLQkJSVdlYlNlcnZpY2VJbXBsIGlXZWJTZXJ2aWNlID0gbmV3IElXZWJTZXJ2aWNlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJTZXJ2aWNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlJV2ViU2VydmljZVByb2plY3RJbXBsIGlXZWJTZXJ2aWNlUHJvamVjdCA9IG5ldyBJV2ViU2VydmljZVByb2plY3RJbXBsKCk7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIElXZWJUeXBlIGNyZWF0ZUlXZWJUeXBlKCkgew0KLQkJSVdlYlR5cGVJbXBsIGlXZWJUeXBlID0gbmV3IElXZWJUeXBlSW1wbCgpOw0KLQkJcmV0dXJuIGlXZWJUeXBlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBjcmVhdGVXZWJQYXJhbUtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsNCi0JCVdlYlBhcmFtS2luZCByZXN1bHQgPSBXZWJQYXJhbUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRXZWJQYXJhbUtpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgew0KLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU09BUEJpbmRpbmdTdHlsZSBjcmVhdGVTT0FQQmluZGluZ1N0eWxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIHJlc3VsdCA9IFNPQVBCaW5kaW5nU3R5bGUuZ2V0KGluaXRpYWxWYWx1ZSk7DQotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTT0FQQmluZGluZ1N0eWxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGNyZWF0ZVNPQVBCaW5kaW5nVXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7DQotCQlTT0FQQmluZGluZ1VzZSByZXN1bHQgPSBTT0FQQmluZGluZ1VzZS5nZXQoaW5pdGlhbFZhbHVlKTsNCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgY29udmVydFNPQVBCaW5kaW5nVXNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsNCi0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgY3JlYXRlU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgew0KLQkJU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSByZXN1bHQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLmdldChpbml0aWFsVmFsdWUpOw0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7DQotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21QYWNrYWdlIGdldERvbVBhY2thZ2UoKSB7DQotCQlyZXR1cm4gKERvbVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBkZXByZWNhdGVkDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBEZXByZWNhdGVkDQotCXB1YmxpYyBzdGF0aWMgRG9tUGFja2FnZSBnZXRQYWNrYWdlKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQl9DQotDQotfSAvL0RvbUZhY3RvcnlJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0RvbVBhY2thZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzk1ODhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvRG9tUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklKYXZhV2ViU2VydmljZUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgRG9tUGFja2FnZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaWRvbUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYk1ldGhvZEVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlBhcmFtRUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViU2VydmljZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFQ2xhc3MgaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIEVDbGFzcyBpV2ViVHlwZUVDbGFzcyA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSB3ZWJQYXJhbUtpbmRFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1N0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgRUVudW0gc29hcEJpbmRpbmdVc2VFRW51bSA9IG51bGw7DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBFRW51bSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0gPSBudWxsOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aA0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQ0KLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4NCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYw0KLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3Jtcw0KLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLA0KLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZSNlTlNfVVJJDQotCSAqIEBzZWUgI2luaXQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcml2YXRlIERvbVBhY2thZ2VJbXBsKCkgew0KLQkJc3VwZXIoZU5TX1VSSSwgRG9tRmFjdG9yeS5lSU5TVEFOQ0UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzDQotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlDQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsDQotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcw0KLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsDQotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuDQotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gNCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkDQotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoNCi0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkNCi0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8NCi0JICogdGhvc2Ugb2YgYW5vdGhlci4NCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQ0KLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNlTlNfVVJJDQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpDQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIERvbVBhY2thZ2UgaW5pdCgpIHsNCi0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChEb21QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERvbVBhY2thZ2UuZU5TX1VSSSk7DQotDQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlDQotCQlEb21QYWNrYWdlSW1wbCB0aGVEb21QYWNrYWdlID0gKERvbVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIERvbVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRG9tUGFja2FnZUltcGwoKSk7DQotDQotCQlpc0luaXRlZCA9IHRydWU7DQotDQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cw0KLQkJdGhlRG9tUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsNCi0NCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGENCi0JCXRoZURvbVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOw0KLQ0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZA0KLQkJdGhlRG9tUGFja2FnZS5mcmVlemUoKTsNCi0NCi0JCXJldHVybiB0aGVEb21QYWNrYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJRE9NKCkgew0KLQkJcmV0dXJuIGlkb21FQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJRE9NX1dlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpZG9tRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSB7DQotCQlyZXR1cm4gaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsNCi0JCXJldHVybiBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFUmVmZXJlbmNlIGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfV2ViTWV0aG9kcygpIHsNCi0JCXJldHVybiAoRVJlZmVyZW5jZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViTWV0aG9kKCkgew0KLQkJcmV0dXJuIGlXZWJNZXRob2RFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViTWV0aG9kX1BhcmFtZXRlcnMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9FeGNsdWRlZCgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViTWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViTWV0aG9kX1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViUGFyYW0oKSB7DQotCQlyZXR1cm4gaVdlYlBhcmFtRUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0tpbmQoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVHlwZU5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fUGFydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlBhcmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViUGFyYW1fVGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIChFQXR0cmlidXRlKWlXZWJQYXJhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlBhcmFtX0hlYWRlcigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlNlcnZpY2UoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJV2ViU2VydmljZV9TZXJ2aWNlRW5kcG9pbnQoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1RhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSB7DQotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQXR0cmlidXRlIGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVDbGFzcyBnZXRJV2ViU2VydmljZVByb2plY3QoKSB7DQotCQlyZXR1cm4gaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1dlYlNlcnZpY2VzKCkgew0KLQkJcmV0dXJuIChFUmVmZXJlbmNlKWlXZWJTZXJ2aWNlUHJvamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SVdlYlNlcnZpY2VQcm9qZWN0X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSB7DQotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJV2ViU2VydmljZVByb2plY3RfTmFtZSgpIHsNCi0JCXJldHVybiAoRUF0dHJpYnV0ZSlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFQ2xhc3MgZ2V0SVdlYlR5cGUoKSB7DQotCQlyZXR1cm4gaVdlYlR5cGVFQ2xhc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0V2ViUGFyYW1LaW5kKCkgew0KLQkJcmV0dXJuIHdlYlBhcmFtS2luZEVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZUVFbnVtOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEVFbnVtIGdldFNPQVBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUVudW0gZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW07DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tRmFjdG9yeSBnZXREb21GYWN0b3J5KCkgew0KLQkJcmV0dXJuIChEb21GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcw0KLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7DQotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47DQotCQlpc0NyZWF0ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzDQotCQlpZG9tRUNsYXNzID0gY3JlYXRlRUNsYXNzKElET00pOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpZG9tRUNsYXNzLCBJRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUyk7DQotDQotCQlpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpSmF2YVdlYlNlcnZpY2VFbGVtZW50RUNsYXNzLCBJSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTik7DQotCQljcmVhdGVFQXR0cmlidXRlKGlKYXZhV2ViU2VydmljZUVsZW1lbnRFQ2xhc3MsIElKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUpOw0KLQ0KLQkJaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0UpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTKTsNCi0JCWNyZWF0ZUVSZWZlcmVuY2UoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MsIElTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUVDbGFzcywgSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJNZXRob2RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9NRVRIT0QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19FWENMVURFRCk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViTWV0aG9kRUNsYXNzLCBJV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJNZXRob2RFQ2xhc3MsIElXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFKTsNCi0NCi0JCWlXZWJQYXJhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJV0VCX1BBUkFNKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19LSU5EKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlBhcmFtRUNsYXNzLCBJV0VCX1BBUkFNX19UWVBFX05BTUUpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViUGFyYW1FQ2xhc3MsIElXRUJfUEFSQU1fX1BBUlRfTkFNRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSk7DQotCQljcmVhdGVFQXR0cmlidXRlKGlXZWJQYXJhbUVDbGFzcywgSVdFQl9QQVJBTV9fSEVBREVSKTsNCi0NCi0JCWlXZWJTZXJ2aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfU0VSVklDRSk7DQotCQljcmVhdGVFUmVmZXJlbmNlKGlXZWJTZXJ2aWNlRUNsYXNzLCBJV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZUVDbGFzcywgSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fUE9SVF9OQU1FKTsNCi0JCWNyZWF0ZUVBdHRyaWJ1dGUoaVdlYlNlcnZpY2VFQ2xhc3MsIElXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTik7DQotDQotCQlpV2ViU2VydmljZVByb2plY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVdFQl9TRVJWSUNFX1BST0pFQ1QpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVMpOw0KLQkJY3JlYXRlRVJlZmVyZW5jZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJY3JlYXRlRUF0dHJpYnV0ZShpV2ViU2VydmljZVByb2plY3RFQ2xhc3MsIElXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FKTsNCi0NCi0JCWlXZWJUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElXRUJfVFlQRSk7DQotDQotCQkvLyBDcmVhdGUgZW51bXMNCi0JCXdlYlBhcmFtS2luZEVFbnVtID0gY3JlYXRlRUVudW0oV0VCX1BBUkFNX0tJTkQpOw0KLQkJc29hcEJpbmRpbmdTdHlsZUVFbnVtID0gY3JlYXRlRUVudW0oU09BUF9CSU5ESU5HX1NUWUxFKTsNCi0JCXNvYXBCaW5kaW5nVXNlRUVudW0gPSBjcmVhdGVFRW51bShTT0FQX0JJTkRJTkdfVVNFKTsNCi0JCXNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSA9IGNyZWF0ZUVFbnVtKFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsNCi0NCi0JLyoqDQotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzDQotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgew0KLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsNCi0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlDQotCQlzZXROYW1lKGVOQU1FKTsNCi0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOw0KLQkJc2V0TnNVUkkoZU5TX1VSSSk7DQotDQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzDQotDQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMNCi0NCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMNCi0JCWlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYk1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhV2ViU2VydmljZUVsZW1lbnQoKSk7DQotCQlpV2ViUGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQkJaVdlYlR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YVdlYlNlcnZpY2VFbGVtZW50KCkpOw0KLQ0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMNCi0JCWluaXRFQ2xhc3MoaWRvbUVDbGFzcywgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NLmNsYXNzLCAiSURPTSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SURPTV9XZWJTZXJ2aWNlUHJvamVjdHMoKSwgdGhpcy5nZXRJV2ViU2VydmljZVByb2plY3QoKSwgbnVsbCwgIndlYlNlcnZpY2VQcm9qZWN0cyIsIG51bGwsIDAsIC0xLCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEVDbGFzcywgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIklKYXZhV2ViU2VydmljZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElKYXZhV2ViU2VydmljZUVsZW1lbnRfSW1wbGVtZW50YXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImltcGxlbWVudGF0aW9uIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SUphdmFXZWJTZXJ2aWNlRWxlbWVudF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaW5pdEVDbGFzcyhpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlRUNsYXNzLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAiSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsaWNpdCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxpY2l0IiwgbnVsbCwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9JbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIHRoaXMuZ2V0SVdlYlNlcnZpY2VfU2VydmljZUVuZHBvaW50KCksICJpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyIsIG51bGwsIDEsIC0xLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RVJlZmVyZW5jZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1dlYk1ldGhvZHMoKSwgdGhpcy5nZXRJV2ViTWV0aG9kKCksIG51bGwsICJ3ZWJNZXRob2RzIiwgbnVsbCwgMSwgLTEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nU3R5bGUoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1N0eWxlKCksICJzb2FwQmluZGluZ1N0eWxlIiwgIkRPQ1VNRU5UIiwgMSwgMSwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX1NvYXBCaW5kaW5nVXNlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdVc2UoKSwgInNvYXBCaW5kaW5nVXNlIiwgIkxJVEVSQUwiLCAxLCAxLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKSwgInNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiLCAiV1JBUFBFRCIsIDEsIDEsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQkJaW5pdEVDbGFzcyhpV2ViTWV0aG9kRUNsYXNzLCBJV2ViTWV0aG9kLmNsYXNzLCAiSVdlYk1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SVdlYk1ldGhvZF9QYXJhbWV0ZXJzKCksIHRoaXMuZ2V0SVdlYlBhcmFtKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMSwgLTEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfRXhjbHVkZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJleGNsdWRlZCIsIG51bGwsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdTdHlsZSgpLCB0aGlzLmdldFNPQVBCaW5kaW5nU3R5bGUoKSwgInNvYXBCaW5kaW5nU3R5bGUiLCAiRE9DVU1FTlQiLCAxLCAxLCBJV2ViTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJNZXRob2RfU29hcEJpbmRpbmdVc2UoKSwgdGhpcy5nZXRTT0FQQmluZGluZ1VzZSgpLCAic29hcEJpbmRpbmdVc2UiLCAiTElURVJBTCIsIDEsIDEsIElXZWJNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYk1ldGhvZF9Tb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCksIHRoaXMuZ2V0U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpLCAic29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSIsICJXUkFQUEVEIiwgMSwgMSwgSVdlYk1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpbml0RUNsYXNzKGlXZWJQYXJhbUVDbGFzcywgSVdlYlBhcmFtLmNsYXNzLCAiSVdlYlBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fS2luZCgpLCB0aGlzLmdldFdlYlBhcmFtS2luZCgpLCAia2luZCIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1R5cGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlTmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1BhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJ0TmFtZSIsIG51bGwsIDEsIDEsIElXZWJQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlBhcmFtX1RhcmdldE5hbWVzcGFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFyZ2V0TmFtZXNwYWNlIiwgbnVsbCwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotCQlpbml0RUF0dHJpYnV0ZShnZXRJV2ViUGFyYW1fSGVhZGVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGVhZGVyIiwgImZhbHNlIiwgMSwgMSwgSVdlYlBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VFQ2xhc3MsIElXZWJTZXJ2aWNlLmNsYXNzLCAiSVdlYlNlcnZpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlX1NlcnZpY2VFbmRwb2ludCgpLCB0aGlzLmdldElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhpcy5nZXRJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX0ltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfVGFyZ2V0TmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YXJnZXROYW1lc3BhY2UiLCBudWxsLCAxLCAxLCBJV2ViU2VydmljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SVdlYlNlcnZpY2VfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlX1dzZGxMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbExvY2F0aW9uIiwgbnVsbCwgMCwgMSwgSVdlYlNlcnZpY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWluaXRFQ2xhc3MoaVdlYlNlcnZpY2VQcm9qZWN0RUNsYXNzLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICJJV2ViU2VydmljZVByb2plY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9XZWJTZXJ2aWNlcygpLCB0aGlzLmdldElXZWJTZXJ2aWNlKCksIG51bGwsICJ3ZWJTZXJ2aWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFUmVmZXJlbmNlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCksIHRoaXMuZ2V0SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBudWxsLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyIsIG51bGwsIDAsIC0xLCBJV2ViU2VydmljZVByb2plY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCWluaXRFQXR0cmlidXRlKGdldElXZWJTZXJ2aWNlUHJvamVjdF9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgSVdlYlNlcnZpY2VQcm9qZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkDQotDQotCQlpbml0RUNsYXNzKGlXZWJUeXBlRUNsYXNzLCBJV2ViVHlwZS5jbGFzcywgIklXZWJUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscw0KLQkJaW5pdEVFbnVtKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuY2xhc3MsICJXZWJQYXJhbUtpbmQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU4pOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuSU5PVVQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHdlYlBhcmFtS2luZEVFbnVtLCBXZWJQYXJhbUtpbmQuT1VUKTsNCi0NCi0JCWluaXRFRW51bShzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuY2xhc3MsICJTT0FQQmluZGluZ1N0eWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1N0eWxlRUVudW0sIFNPQVBCaW5kaW5nU3R5bGUuRE9DVU1FTlQpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nU3R5bGVFRW51bSwgU09BUEJpbmRpbmdTdHlsZS5SUEMpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLmNsYXNzLCAiU09BUEJpbmRpbmdVc2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkxJVEVSQUwpOw0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nVXNlRUVudW0sIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQpOw0KLQ0KLQkJaW5pdEVFbnVtKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5jbGFzcywgIlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJYWRkRUVudW1MaXRlcmFsKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVFRW51bSwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsNCi0JCWFkZEVFbnVtTGl0ZXJhbChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlRUVudW0sIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSk7DQotDQotCQkvLyBDcmVhdGUgcmVzb3VyY2UNCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOw0KLQl9DQotDQotfSAvL0RvbVBhY2thZ2VJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lET01JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFlODY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSURPTUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotDQotLyoqDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SURPTTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JRE9NSW1wbCNnZXRXZWJTZXJ2aWNlUHJvamVjdHMgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSURPTUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElET00gew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2ViU2VydmljZVByb2plY3RzKCkgPGVtPldlYiBTZXJ2aWNlIFByb2plY3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdlYlNlcnZpY2VQcm9qZWN0cygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IHdlYlNlcnZpY2VQcm9qZWN0czsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSURPTUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSURPTTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZVByb2plY3Q+IGdldFdlYlNlcnZpY2VQcm9qZWN0cygpIHsNCi0JCWlmICh3ZWJTZXJ2aWNlUHJvamVjdHMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlUHJvamVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SVdlYlNlcnZpY2VQcm9qZWN0PihJV2ViU2VydmljZVByb2plY3QuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYlNlcnZpY2VQcm9qZWN0czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0V2ViU2VydmljZVByb2plY3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTOg0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlUHJvamVjdD4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCWdldFdlYlNlcnZpY2VQcm9qZWN0cygpLmNsZWFyKCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFM6DQotCQkJCXJldHVybiB3ZWJTZXJ2aWNlUHJvamVjdHMgIT0gbnVsbCAmJiAhd2ViU2VydmljZVByb2plY3RzLmlzRW1wdHkoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsNCi0JfQ0KLQ0KLX0gLy9JRE9NSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ4MGMxMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQ8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOg0KLSAqIDx1bD4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0SW1wbGVtZW50YXRpb24gPGVtPkltcGxlbWVudGF0aW9uPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRhdGlvbigpIDxlbT5JbXBsZW1lbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0SW1wbGVtZW50YXRpb24oKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGltcGxlbWVudGF0aW9uID0gSU1QTEVNRU5UQVRJT05fRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsNCi0JCXJldHVybiBpbXBsZW1lbnRhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uKFN0cmluZyBuZXdJbXBsZW1lbnRhdGlvbikgew0KLQkJU3RyaW5nIG9sZEltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247DQotCQlpbXBsZW1lbnRhdGlvbiA9IG5ld0ltcGxlbWVudGF0aW9uOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIG9sZEltcGxlbWVudGF0aW9uLCBpbXBsZW1lbnRhdGlvbikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7DQotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7DQotCQluYW1lID0gbmV3TmFtZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJCXJldHVybiBnZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJc2V0SW1wbGVtZW50YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OOg0KLQkJCQlzZXRJbXBsZW1lbnRhdGlvbihJTVBMRU1FTlRBVElPTl9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTjoNCi0JCQkJcmV0dXJuIElNUExFTUVOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyBpbXBsZW1lbnRhdGlvbiAhPSBudWxsIDogIUlNUExFTUVOVEFUSU9OX0VERUZBVUxULmVxdWFscyhpbXBsZW1lbnRhdGlvbik7DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsZW1lbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGVtZW50YXRpb24pOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMGU1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNpc0ltcGxpY2l0IDxlbT5JbXBsaWNpdDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwjZ2V0V2ViTWV0aG9kcyA8ZW0+V2ViIE1ldGhvZHM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRUYXJnZXROYW1lc3BhY2UgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSB7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTVBMSUNJVF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbXBsaWNpdCgpIDxlbT5JbXBsaWNpdDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNJbXBsaWNpdCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpY2l0ID0gSU1QTElDSVRfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpIDxlbT5JbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIEVMaXN0PElXZWJTZXJ2aWNlPiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlczsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlYk1ldGhvZHMoKSA8ZW0+V2ViIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViTWV0aG9kcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViTWV0aG9kPiB3ZWJNZXRob2RzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldE5hbWVzcGFjZSgpIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRUYXJnZXROYW1lc3BhY2UoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9IFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdCgpIHsNCi0JCXJldHVybiBpbXBsaWNpdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltcGxpY2l0KGJvb2xlYW4gbmV3SW1wbGljaXQpIHsNCi0JCWJvb2xlYW4gb2xkSW1wbGljaXQgPSBpbXBsaWNpdDsNCi0JCWltcGxpY2l0ID0gbmV3SW1wbGljaXQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBvbGRJbXBsaWNpdCwgaW1wbGljaXQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSB7DQotCQlpZiAoaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQlpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCk7DQotCQl9DQotCQlyZXR1cm4gaW1wbGVtZW50aW5nV2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYk1ldGhvZD4gZ2V0V2ViTWV0aG9kcygpIHsNCi0JCWlmICh3ZWJNZXRob2RzID09IG51bGwpDQotCQl7DQotCQkJd2ViTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViTWV0aG9kPihJV2ViTWV0aG9kLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMpOw0KLQkJfQ0KLQkJcmV0dXJuIHdlYk1ldGhvZHM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsNCi0JCXJldHVybiB0YXJnZXROYW1lc3BhY2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgew0KLQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsNCi0JCXRhcmdldE5hbWVzcGFjZSA9IG5ld1RhcmdldE5hbWVzcGFjZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1N0eWxlIGdldFNvYXBCaW5kaW5nU3R5bGUoKSB7DQotCQlyZXR1cm4gc29hcEJpbmRpbmdTdHlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nU3R5bGUoU09BUEJpbmRpbmdTdHlsZSBuZXdTb2FwQmluZGluZ1N0eWxlKSB7DQotCQlTT0FQQmluZGluZ1N0eWxlIG9sZFNvYXBCaW5kaW5nU3R5bGUgPSBzb2FwQmluZGluZ1N0eWxlOw0KLQkJc29hcEJpbmRpbmdTdHlsZSA9IG5ld1NvYXBCaW5kaW5nU3R5bGUgPT0gbnVsbCA/IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRSwgb2xkU29hcEJpbmRpbmdTdHlsZSwgc29hcEJpbmRpbmdTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGdldFNvYXBCaW5kaW5nVXNlKCkgew0KLQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdVc2UoU09BUEJpbmRpbmdVc2UgbmV3U29hcEJpbmRpbmdVc2UpIHsNCi0JCVNPQVBCaW5kaW5nVXNlIG9sZFNvYXBCaW5kaW5nVXNlID0gc29hcEJpbmRpbmdVc2U7DQotCQlzb2FwQmluZGluZ1VzZSA9IG5ld1NvYXBCaW5kaW5nVXNlID09IG51bGwgPyBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdVc2U7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEUsIG9sZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KShJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGlzSW1wbGljaXQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJcmV0dXJuIGdldFdlYk1ldGhvZHMoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlyZXR1cm4gZ2V0U29hcEJpbmRpbmdTdHlsZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lUOg0KLQkJCQlzZXRJbXBsaWNpdCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTOg0KLQkJCQlnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpLmNsZWFyKCk7DQotCQkJCWdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViU2VydmljZT4pbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlnZXRXZWJNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJV2ViTWV0aG9kPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoKFNPQVBCaW5kaW5nU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoKFNPQVBCaW5kaW5nVXNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJc2V0SW1wbGljaXQoSU1QTElDSVRfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUzoNCi0JCQkJZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCWdldFdlYk1ldGhvZHMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1N0eWxlKFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFOg0KLQkJCQlzZXRTb2FwQmluZGluZ1VzZShTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVDoNCi0JCQkJcmV0dXJuIGltcGxpY2l0ICE9IElNUExJQ0lUX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcyAhPSBudWxsICYmICFpbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcy5pc0VtcHR5KCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFM6DQotCQkJCXJldHVybiB3ZWJNZXRob2RzICE9IG51bGwgJiYgIXdlYk1ldGhvZHMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXROYW1lc3BhY2UgIT0gbnVsbCA6ICFUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxULmVxdWFscyh0YXJnZXROYW1lc3BhY2UpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1VzZSAhPSBTT0FQX0JJTkRJTkdfVVNFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlICE9IFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBsaWNpdDogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoaW1wbGljaXQpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1VzZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdVc2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlIA0KLQlwdWJsaWMgRU9iamVjdCBlQ29udGFpbmVyKCkNCi0Jew0KLQkJaWYgKHN1cGVyLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCXJldHVybiBzdXBlci5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBnZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdzLmVDb250YWluZXIoKSE9bnVsbCkgew0KLQkJCQlyZXR1cm4gd3MuZUNvbnRhaW5lcigpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi19IC8vSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYk1ldGhvZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmJhNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViTWV0aG9kSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIE1ldGhvZDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYk1ldGhvZEltcGwjaXNFeGNsdWRlZCA8ZW0+RXhjbHVkZWQ8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1N0eWxlIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViTWV0aG9kSW1wbCNnZXRTb2FwQmluZGluZ1VzZSA8ZW0+U29hcCBCaW5kaW5nIFVzZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJNZXRob2RJbXBsI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn08L2xpPg0KLSAqIDwvdWw+DQotICogPC9wPg0KLSAqDQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViTWV0aG9kSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYk1ldGhvZCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbWV0ZXJzKCkgPGVtPlBhcmFtZXRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVycygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJV2ViUGFyYW0+IHBhcmFtZXRlcnM7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFRF9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlZCgpIDxlbT5FeGNsdWRlZDwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjaXNFeGNsdWRlZCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVkID0gRVhDTFVERURfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNPQVBCaW5kaW5nU3R5bGUgU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUID0gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBCaW5kaW5nU3R5bGUoKSA8ZW0+U29hcCBCaW5kaW5nIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1N0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFNPQVBCaW5kaW5nU3R5bGUgc29hcEJpbmRpbmdTdHlsZSA9IFNPQVBfQklORElOR19TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU09BUEJpbmRpbmdVc2UgU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA9IFNPQVBCaW5kaW5nVXNlLkxJVEVSQUw7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1VzZSgpIDxlbT5Tb2FwIEJpbmRpbmcgVXNlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1VzZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTT0FQQmluZGluZ1VzZSBzb2FwQmluZGluZ1VzZSA9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIDxlbT5Tb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIFNPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEVfRURFRkFVTFQgPSBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotDQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgPGVtPlNvYXAgQmluZGluZyBQYXJhbWV0ZXIgU3R5bGU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZEltcGwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgew0KLQkJcmV0dXJuIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9NRVRIT0Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVdlYlBhcmFtPiBnZXRQYXJhbWV0ZXJzKCkgew0KLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkNCi0JCXsNCi0JCQlwYXJhbWV0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PElXZWJQYXJhbT4oSVdlYlBhcmFtLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTKTsNCi0JCX0NCi0JCXJldHVybiBwYXJhbWV0ZXJzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlZCgpIHsNCi0JCXJldHVybiBleGNsdWRlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVkKGJvb2xlYW4gbmV3RXhjbHVkZWQpIHsNCi0JCWJvb2xlYW4gb2xkRXhjbHVkZWQgPSBleGNsdWRlZDsNCi0JCWV4Y2x1ZGVkID0gbmV3RXhjbHVkZWQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIG9sZEV4Y2x1ZGVkLCBleGNsdWRlZCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZ2V0U29hcEJpbmRpbmdTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1N0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdTdHlsZShTT0FQQmluZGluZ1N0eWxlIG5ld1NvYXBCaW5kaW5nU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nU3R5bGUgb2xkU29hcEJpbmRpbmdTdHlsZSA9IHNvYXBCaW5kaW5nU3R5bGU7DQotCQlzb2FwQmluZGluZ1N0eWxlID0gbmV3U29hcEJpbmRpbmdTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUIDogbmV3U29hcEJpbmRpbmdTdHlsZTsNCi0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEUsIG9sZFNvYXBCaW5kaW5nU3R5bGUsIHNvYXBCaW5kaW5nU3R5bGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTT0FQQmluZGluZ1VzZSBnZXRTb2FwQmluZGluZ1VzZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1VzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNvYXBCaW5kaW5nVXNlKFNPQVBCaW5kaW5nVXNlIG5ld1NvYXBCaW5kaW5nVXNlKSB7DQotCQlTT0FQQmluZGluZ1VzZSBvbGRTb2FwQmluZGluZ1VzZSA9IHNvYXBCaW5kaW5nVXNlOw0KLQkJc29hcEJpbmRpbmdVc2UgPSBuZXdTb2FwQmluZGluZ1VzZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nVXNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0UsIG9sZFNvYXBCaW5kaW5nVXNlLCBzb2FwQmluZGluZ1VzZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpIHsNCi0JCXJldHVybiBzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpIHsNCi0JCVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9IHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlzb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlID0gbmV3U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSA9PSBudWxsID8gU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCA6IG5ld1NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwgb2xkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSwgc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBnZXRQYXJhbWV0ZXJzKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJcmV0dXJuIGlzRXhjbHVkZWQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nU3R5bGUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXJldHVybiBnZXRTb2FwQmluZGluZ1VzZSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRToNCi0JCQkJcmV0dXJuIGdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19QQVJBTUVURVJTOg0KLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0UGFyYW1ldGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSVdlYlBhcmFtPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCQlzZXRFeGNsdWRlZCgoQm9vbGVhbiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJc2V0U29hcEJpbmRpbmdTdHlsZSgoU09BUEJpbmRpbmdTdHlsZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19VU0U6DQotCQkJCXNldFNvYXBCaW5kaW5nVXNlKChTT0FQQmluZGluZ1VzZSluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCWdldFBhcmFtZXRlcnMoKS5jbGVhcigpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19FWENMVURFRDoNCi0JCQkJc2V0RXhjbHVkZWQoRVhDTFVERURfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nU3R5bGUoU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJc2V0U29hcEJpbmRpbmdVc2UoU09BUF9CSU5ESU5HX1VTRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCXNldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1BBUkFNRVRFUlM6DQotCQkJCXJldHVybiBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQ6DQotCQkJCXJldHVybiBleGNsdWRlZCAhPSBFWENMVURFRF9FREVGQVVMVDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19TVFlMRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nU3R5bGUgIT0gU09BUF9CSU5ESU5HX1NUWUxFX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQkJcmV0dXJuIHNvYXBCaW5kaW5nVXNlICE9IFNPQVBfQklORElOR19VU0VfRURFRkFVTFQ7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlyZXR1cm4gc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSAhPSBTT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFX0VERUZBVUxUOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7DQotDQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiAoZXhjbHVkZWQ6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVkKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcEJpbmRpbmdTdHlsZTogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQoc29hcEJpbmRpbmdTdHlsZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nVXNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChzb2FwQmluZGluZ1VzZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUpOw0KLQkJcmVzdWx0LmFwcGVuZCgnKScpOw0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOw0KLQl9DQotDQotfSAvL0lXZWJNZXRob2RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViUGFyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxNTA0ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJQYXJhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFBhcmFtPC9iPjwvZW0+Jy4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiA8cD4NCi0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoNCi0gKiA8dWw+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VHlwZU5hbWUgPGVtPlR5cGUgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0UGFydE5hbWUgPGVtPlBhcnQgTmFtZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJQYXJhbUltcGwjZ2V0VGFyZ2V0TmFtZXNwYWNlIDxlbT5UYXJnZXQgTmFtZXNwYWNlPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlBhcmFtSW1wbCNpc0hlYWRlciA8ZW0+SGVhZGVyPC9lbT59PC9saT4NCi0gKiA8L3VsPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlBhcmFtSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlBhcmFtIHsNCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldEtpbmQoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdlYlBhcmFtS2luZCBLSU5EX0VERUZBVUxUID0gV2ViUGFyYW1LaW5kLklOOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRLaW5kKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFdlYlBhcmFtS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlTmFtZSgpIDxlbT5UeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFR5cGVOYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FX0VERUZBVUxUID0gbnVsbDsNCi0NCi0JLyoqDQotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVOYW1lKCkgPGVtPlR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VHlwZU5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGVOYW1lID0gVFlQRV9OQU1FX0VERUZBVUxUOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnROYW1lKCkgPGVtPlBhcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UGFydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydE5hbWUoKSA8ZW0+UGFydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQYXJ0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcGFydE5hbWUgPSBQQVJUX05BTUVfRURFRkFVTFQ7DQotDQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgPGVtPlRhcmdldCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFRhcmdldE5hbWVzcGFjZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hlYWRlcigpIDxlbT5IZWFkZXI8L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2lzSGVhZGVyKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhFQURFUl9FREVGQVVMVCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIZWFkZXIoKSA8ZW0+SGVhZGVyPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNpc0hlYWRlcigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIGhlYWRlciA9IEhFQURFUl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlBhcmFtSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFdlYlBhcmFtS2luZCBnZXRLaW5kKCkgew0KLQkJcmV0dXJuIGtpbmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFdlYlBhcmFtS2luZCBuZXdLaW5kKSB7DQotCQlXZWJQYXJhbUtpbmQgb2xkS2luZCA9IGtpbmQ7DQotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5ELCBvbGRLaW5kLCBraW5kKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgew0KLQkJcmV0dXJuIHR5cGVOYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHlwZU5hbWUoU3RyaW5nIG5ld1R5cGVOYW1lKSB7DQotCQlTdHJpbmcgb2xkVHlwZU5hbWUgPSB0eXBlTmFtZTsNCi0JCXR5cGVOYW1lID0gbmV3VHlwZU5hbWU7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUUsIG9sZFR5cGVOYW1lLCB0eXBlTmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0TmFtZSgpIHsNCi0JCXJldHVybiBwYXJ0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKFN0cmluZyBuZXdQYXJ0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBhcnROYW1lID0gcGFydE5hbWU7DQotCQlwYXJ0TmFtZSA9IG5ld1BhcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLCBvbGRQYXJ0TmFtZSwgcGFydE5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSwgb2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGVyKCkgew0KLQkJcmV0dXJuIGhlYWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRlcihib29sZWFuIG5ld0hlYWRlcikgew0KLQkJYm9vbGVhbiBvbGRIZWFkZXIgPSBoZWFkZXI7DQotCQloZWFkZXIgPSBuZXdIZWFkZXI7DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVIsIG9sZEhlYWRlciwgaGVhZGVyKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXJldHVybiBnZXRLaW5kKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RZUEVfTkFNRToNCi0JCQkJcmV0dXJuIGdldFR5cGVOYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIGdldFBhcnROYW1lKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXJldHVybiBnZXRUYXJnZXROYW1lc3BhY2UoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlyZXR1cm4gaXNIZWFkZXIoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQkJc2V0S2luZCgoV2ViUGFyYW1LaW5kKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXNldFR5cGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJc2V0VGFyZ2V0TmFtZXNwYWNlKChTdHJpbmcpbmV3VmFsdWUpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJc2V0SGVhZGVyKChCb29sZWFuKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCQlzZXRUeXBlTmFtZShUWVBFX05BTUVfRURFRkFVTFQpOw0KLQkJCQlyZXR1cm47DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJc2V0UGFydE5hbWUoUEFSVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlzZXRUYXJnZXROYW1lc3BhY2UoVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fSEVBREVSOg0KLQkJCQlzZXRIZWFkZXIoSEVBREVSX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19LSU5EOg0KLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UWVBFX05BTUU6DQotCQkJCXJldHVybiBUWVBFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVOYW1lICE9IG51bGwgOiAhVFlQRV9OQU1FX0VERUZBVUxULmVxdWFscyh0eXBlTmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1BBUlRfTkFNRToNCi0JCQkJcmV0dXJuIFBBUlRfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcGFydE5hbWUgIT0gbnVsbCA6ICFQQVJUX05BTUVfRURFRkFVTFQuZXF1YWxzKHBhcnROYW1lKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQkJcmV0dXJuIFRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldE5hbWVzcGFjZSAhPSBudWxsIDogIVRBUkdFVF9OQU1FU1BBQ0VfRURFRkFVTFQuZXF1YWxzKHRhcmdldE5hbWVzcGFjZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJcmV0dXJuIGhlYWRlciAhPSBIRUFERVJfRURFRkFVTFQ7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChraW5kKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHR5cGVOYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydE5hbWU6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHBhcnROYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoIiwgdGFyZ2V0TmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXROYW1lc3BhY2UpOw0KLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWFkZXI6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKGhlYWRlcik7DQotCQlyZXN1bHQuYXBwZW5kKCcpJyk7DQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0NCi19IC8vSVdlYlBhcmFtSW1wbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViU2VydmljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU4NDVlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklXZWIgU2VydmljZTwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZUltcGwjZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFRhcmdldE5hbWVzcGFjZSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlSW1wbCNnZXRQb3J0TmFtZSA8ZW0+UG9ydCBOYW1lPC9lbT59PC9saT4NCi0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGwuSVdlYlNlcnZpY2VJbXBsI2dldFdzZGxMb2NhdGlvbiA8ZW0+V3NkbCBMb2NhdGlvbjwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlSW1wbCBleHRlbmRzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgSVdlYlNlcnZpY2Ugew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50KCkgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFNlcnZpY2VFbmRwb2ludCgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlcnZpY2VFbmRwb2ludDsNCi0NCi0JLyoqDQotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9IG51bGw7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXROYW1lc3BhY2UoKSA8ZW0+VGFyZ2V0IE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0VGFyZ2V0TmFtZXNwYWNlKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUOw0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROYW1lKCkgPGVtPlBvcnQgTmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0UG9ydE5hbWUoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE5hbWUoKSA8ZW0+UG9ydCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXRQb3J0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgcG9ydE5hbWUgPSBQT1JUX05BTUVfRURFRkFVTFQ7DQotCS8qKg0KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPSBudWxsOw0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V3NkbExvY2F0aW9uKCkgPGVtPldzZGwgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBzZWUgI2dldFdzZGxMb2NhdGlvbigpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBTdHJpbmcgd3NkbExvY2F0aW9uID0gV1NETF9MT0NBVElPTl9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VJbXBsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCi0JCXJldHVybiBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbCAmJiBzZXJ2aWNlRW5kcG9pbnQuZUlzUHJveHkoKSkNCi0JCXsNCi0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2VydmljZUVuZHBvaW50ID0gKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQ7DQotCQkJc2VydmljZUVuZHBvaW50ID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZVJlc29sdmVQcm94eShvbGRTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChzZXJ2aWNlRW5kcG9pbnQgIT0gb2xkU2VydmljZUVuZHBvaW50KQ0KLQkJCXsNCi0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBvbGRTZXJ2aWNlRW5kcG9pbnQsIHNlcnZpY2VFbmRwb2ludCkpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBiYXNpY0dldFNlcnZpY2VFbmRwb2ludCgpIHsNCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBuZXdTZXJ2aWNlRW5kcG9pbnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2xkU2VydmljZUVuZHBvaW50ID0gc2VydmljZUVuZHBvaW50Ow0KLQkJc2VydmljZUVuZHBvaW50ID0gbmV3U2VydmljZUVuZHBvaW50Ow0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJew0KLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgb2xkU2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpOw0KLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsNCi0JCX0NCi0JCXJldHVybiBtc2dzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2VydmljZUVuZHBvaW50KElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgbmV3U2VydmljZUVuZHBvaW50KSB7DQotCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IHNlcnZpY2VFbmRwb2ludCkNCi0JCXsNCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsNCi0JCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQlpZiAobmV3U2VydmljZUVuZHBvaW50ICE9IG51bGwpDQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXJ2aWNlRW5kcG9pbnQpLmVJbnZlcnNlQWRkKHRoaXMsIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMRU1FTlRJTkdfV0VCX1NFUlZJQ0VTLCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCBtc2dzKTsNCi0JCQltc2dzID0gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQobmV3U2VydmljZUVuZHBvaW50LCBtc2dzKTsNCi0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7DQotCQl9DQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkNCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVCwgbmV3U2VydmljZUVuZHBvaW50LCBuZXdTZXJ2aWNlRW5kcG9pbnQpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKCkgew0KLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhcmdldE5hbWVzcGFjZShTdHJpbmcgbmV3VGFyZ2V0TmFtZXNwYWNlKSB7DQotCQlTdHJpbmcgb2xkVGFyZ2V0TmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOw0KLQkJdGFyZ2V0TmFtZXNwYWNlID0gbmV3VGFyZ2V0TmFtZXNwYWNlOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFLCBvbGRUYXJnZXROYW1lc3BhY2UsIHRhcmdldE5hbWVzcGFjZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZSgpIHsNCi0JCXJldHVybiBwb3J0TmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBuZXdQb3J0TmFtZSkgew0KLQkJU3RyaW5nIG9sZFBvcnROYW1lID0gcG9ydE5hbWU7DQotCQlwb3J0TmFtZSA9IG5ld1BvcnROYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUUsIG9sZFBvcnROYW1lLCBwb3J0TmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXc2RsTG9jYXRpb24oKSB7DQotCQlyZXR1cm4gd3NkbExvY2F0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0V3NkbExvY2F0aW9uKFN0cmluZyBuZXdXc2RsTG9jYXRpb24pIHsNCi0JCVN0cmluZyBvbGRXc2RsTG9jYXRpb24gPSB3c2RsTG9jYXRpb247DQotCQl3c2RsTG9jYXRpb24gPSBuZXdXc2RsTG9jYXRpb247DQotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpDQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT04sIG9sZFdzZGxMb2NhdGlvbiwgd3NkbExvY2F0aW9uKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJaWYgKHNlcnZpY2VFbmRwb2ludCAhPSBudWxsKQ0KLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludCkuZUludmVyc2VSZW1vdmUodGhpcywgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExFTUVOVElOR19XRUJfU0VSVklDRVMsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MsIG1zZ3MpOw0KLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXJ2aWNlRW5kcG9pbnQoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upb3RoZXJFbmQsIG1zZ3MpOw0KLQkJfQ0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBiYXNpY1NldFNlcnZpY2VFbmRwb2ludChudWxsLCBtc2dzKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5UOg0KLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCQlyZXR1cm4gYmFzaWNHZXRTZXJ2aWNlRW5kcG9pbnQoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCQlyZXR1cm4gZ2V0UG9ydE5hbWUoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlyZXR1cm4gZ2V0V3NkbExvY2F0aW9uKCk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQkJc2V0U2VydmljZUVuZHBvaW50KChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19XU0RMX0xPQ0FUSU9OOg0KLQkJCQlzZXRXc2RsTG9jYXRpb24oKFN0cmluZyluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSludWxsKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJCXNldFRhcmdldE5hbWVzcGFjZShUQVJHRVRfTkFNRVNQQUNFX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1BPUlRfTkFNRToNCi0JCQkJc2V0UG9ydE5hbWUoUE9SVF9OQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1dTRExfTE9DQVRJT046DQotCQkJCXNldFdzZGxMb2NhdGlvbihXU0RMX0xPQ0FUSU9OX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQ6DQotCQkJCXJldHVybiBzZXJ2aWNlRW5kcG9pbnQgIT0gbnVsbDsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCQlyZXR1cm4gVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVCA9PSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgOiAhVEFSR0VUX05BTUVTUEFDRV9FREVGQVVMVC5lcXVhbHModGFyZ2V0TmFtZXNwYWNlKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJCXJldHVybiBQT1JUX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROYW1lICE9IG51bGwgOiAhUE9SVF9OQU1FX0VERUZBVUxULmVxdWFscyhwb3J0TmFtZSk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTjoNCi0JCQkJcmV0dXJuIFdTRExfTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHdzZGxMb2NhdGlvbiAhPSBudWxsIDogIVdTRExfTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKHdzZGxMb2NhdGlvbik7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiICh0YXJnZXROYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQuYXBwZW5kKHRhcmdldE5hbWVzcGFjZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7DQotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxMb2NhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQNCi0JCXJlc3VsdC5hcHBlbmQod3NkbExvY2F0aW9uKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZUltcGwNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJTZXJ2aWNlUHJvamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWIxM2YzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL2ltcGwvSVdlYlNlcnZpY2VQcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFNlcnZpY2UgUHJvamVjdDwvYj48L2VtPicuDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogPHA+DQotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQotICogPHVsPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFdlYlNlcnZpY2VzIDxlbT5XZWIgU2VydmljZXM8L2VtPn08L2xpPg0KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwuaW1wbC5JV2ViU2VydmljZVByb2plY3RJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlczwvZW0+fTwvbGk+DQotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5pbXBsLklXZWJTZXJ2aWNlUHJvamVjdEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+DQotICogPC91bD4NCi0gKiA8L3A+DQotICoNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlUHJvamVjdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElXZWJTZXJ2aWNlUHJvamVjdCB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJTZXJ2aWNlcygpIDxlbT5XZWIgU2VydmljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0V2ViU2VydmljZXMoKQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqIEBvcmRlcmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgRUxpc3Q8SVdlYlNlcnZpY2U+IHdlYlNlcnZpY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIDxlbT5TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPiBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzOw0KLQ0KLQkvKioNCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHNlZSAjZ2V0TmFtZSgpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICogQG9yZGVyZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAc2VlICNnZXROYW1lKCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKiBAb3JkZXJlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsNCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0SW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBFTGlzdDxJV2ViU2VydmljZT4gZ2V0V2ViU2VydmljZXMoKSB7DQotCQlpZiAod2ViU2VydmljZXMgPT0gbnVsbCkNCi0JCXsNCi0JCQl3ZWJTZXJ2aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJV2ViU2VydmljZT4oSVdlYlNlcnZpY2UuY2xhc3MsIHRoaXMsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyk7DQotCQl9DQotCQlyZXR1cm4gd2ViU2VydmljZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRUxpc3Q8SVNlcnZpY2VFbmRwb2ludEludGVyZmFjZT4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpIHsNCi0JCWlmIChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzID09IG51bGwpDQotCQl7DQotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlPihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmNsYXNzLCB0aGlzLCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMpOw0KLQkJfQ0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsNCi0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsNCi0JCW5hbWUgPSBuZXdOYW1lOw0KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQ0KLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7DQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkNCi0JCXsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUzoNCi0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJTZXJ2aWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVM6DQotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCXJldHVybiBnZXRXZWJTZXJ2aWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJcmV0dXJuIGdldE5hbWUoKTsNCi0JCX0NCi0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJZ2V0V2ViU2VydmljZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElXZWJTZXJ2aWNlPiluZXdWYWx1ZSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFUzoNCi0JCQkJZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmNsZWFyKCk7DQotCQkJCWdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+KW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgew0KLQkJc3dpdGNoIChmZWF0dXJlSUQpDQotCQl7DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19XRUJfU0VSVklDRVM6DQotCQkJCWdldFdlYlNlcnZpY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuY2xlYXIoKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fTkFNRToNCi0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCi0JCXN3aXRjaCAoZmVhdHVyZUlEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCQlyZXR1cm4gd2ViU2VydmljZXMgIT0gbnVsbCAmJiAhd2ViU2VydmljZXMuaXNFbXB0eSgpOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlyZXR1cm4gc2VydmljZUVuZHBvaW50SW50ZXJmYWNlcyAhPSBudWxsICYmICFzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzLmlzRW1wdHkoKTsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7DQotCQl9DQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOw0KLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsNCi0JCXJlc3VsdC5hcHBlbmQoJyknKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLX0gLy9JV2ViU2VydmljZVByb2plY3RJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9pbXBsL0lXZWJUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MWM1OThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvaW1wbC9JV2ViVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLmltcGw7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JV2ViIFR5cGU8L2I+PC9lbT4nLg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIDxwPg0KLSAqIDwvcD4NCi0gKg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlR5cGVJbXBsIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEltcGwgaW1wbGVtZW50cyBJV2ViVHlwZSB7DQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJUeXBlSW1wbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7DQotCQlyZXR1cm4gRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1RZUEU7DQotCX0NCi0NCi19IC8vSVdlYlR5cGVJbXBsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0MDM0MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4V3NEb21SdW50aW1lTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmludGVybmFsLnBsdWdpbi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV3NEb21TdGFydHVwUGFydGljaXBhbnRfU3RhcnR1cF9Kb2JfTWVzc2FnZTsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRDsNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfRE9NX0xPQURJTkc7DQotCQ0KLQlzdGF0aWMgew0KLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIEpheFdzRG9tUnVudGltZU1lc3NhZ2VzKCkgew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL0pheFdzRG9tUnVudGltZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZjhmZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vSmF4V3NEb21SdW50aW1lUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0Ow0KLQ0KLS8qKg0KLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpheFdzRG9tUnVudGltZVBsdWdpbigpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbnMjc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7DQotCQlwbHVnaW4gPSB0aGlzOw0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlwbHVnaW4gPSBudWxsOw0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKYXhXc0RvbVJ1bnRpbWVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvcGx1Z2luL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2OWRlNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC9wbHVnaW4vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1Xc0RvbVN0YXJ0dXBQYXJ0aWNpcGFudF9TdGFydHVwX0pvYl9NZXNzYWdlCT1Mb2FkaW5nIFdlYiBTZXJ2aWNlIERPTS4uLg0KLVdvcmtzcGFjZUNVRmluZGVyX0xPQURJTkdfQ0FOQ0VMRUQ9SkFYLVdTIERPTSBsb2FkaW5nIGNhbmNlbGVkDQotSkFYV1NfRE9NX0xPQURJTkc9TG9hZGluZyBET00gZm9yIEpBWC1XUyBXZWIgU2VydmljZXMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvTmFtZWRFeHRlbnNpb25JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3Y2E1MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9pbnRlcm5hbC91dGlsL05hbWVkRXh0ZW5zaW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklOYW1lZEV4dGVuc2lvbkluZm87DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHtAbGluayBJTmFtZWRFeHRlbnNpb25JbmZvfS4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSU5hbWVkRXh0ZW5zaW9uSW5mbw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7DQotDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQotDQotCXByb3RlY3RlZCBOYW1lZEV4dGVuc2lvbkluZm8oZmluYWwgU3RyaW5nIHBJZCwgZmluYWwgU3RyaW5nIHBMYWJlbCkNCi0Jew0KLQkJdGhpcy5pZCA9IHBJZDsNCi0JCXRoaXMubmFtZSA9IHBMYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkNCi0Jew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpDQotCXsNCi0JCXJldHVybiBuYW1lOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvaW50ZXJuYWwvdXRpbC9YcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDY0MjJiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL2ludGVybmFsL3V0aWwvWHBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0NCi0vKioNCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB3b3JraW5nIHdpdGggZXh0ZW5kaW9uIHBvaW50cy4NCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgWHBVdGlsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIkNvbnN1bWVyVHlwZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKiogICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQgPSAiaW1wbGVtZW50YXRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKiAgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gZXh0DQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgZXh0ZW50aW9uIGltcGxlbWVudGF0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBpbnN0YW50aWF0ZUltcGxlbWVudGF0aW9uKGZpbmFsIElFeHRlbnNpb24gZXh0KQ0KLQl7DQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkNCi0JCXsNCi0JCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UKSkNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZWwuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihYUF9JTVBMRU1FTlRBVElPTl9FTEVNRU5UX0NMQVNTX0FUVFIpOw0KLQkJCQl9IGNhdGNoIChmaW5hbCBDb3JlRXhjZXB0aW9uIGUpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gY3JlYXRlIGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWxvZ2dlcigpLmxvZ0Vycm9yKEVYVEVOU0lPTl9OT1RfUFJPUEVSTFlfUkVHSVNURVJFRCk7DQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBMb2dnZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQW5ub3RhdGlvblNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWM4ZWVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lBbm5vdGF0aW9uU2VyaWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi0NCi0vKioNCi0gKiBUaGlzIGludGVyZmFjZSBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGludGVuZCB0byBkbyBzZXJpYWxpemF0aW9uIGZvciANCi0gKiBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblNlcmlhbGl6ZXIgDQotew0KLQlwdWJsaWMgdm9pZCBzYXZlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzZDY2OTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSUNvbXBpbGF0aW9uVW5pdEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRzIGEgdmlzaXRvciBwYXR0ZXJuIGZvciB0cmF2ZXJzaW5nIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IGRlZmluZSB3aGF0IHNldCBvZiBjb21waWxhdGlvbg0KLSAqIHVuaXRzIHdpbGwgYmUgdHJhdmVyZXNlZC4gVGhpcyBjb3VsZCBiZSBhIHNpbmdsZSBqYXZhIHByb2plY3QsIHRoZSB3aG9sZSB3b3Jrc3BhY2Ugb3IganVzdCBhIGdpdmVuIHBhY2thZ2UuIFRoZSBzZXQgb2YNCi0gKiB0cmF2ZXJzZWQgY29tcGlsYXRpb24gdW5pdHMgaXMgbGVmdCB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24uIE5ldmVydGhlbGVzcyBhcyB0aGVzZSBjb21waWxhdGlvbiB1bml0cyBhcmUgYWx3YXlzIGNvbnRhaW5lZA0KLSAqIGluc2lkZSBhIGphdmEgcHJvamVjdCwgdGhlIDwvYz5JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5oYW5kbGVQcm9qZWN0KElKYXZhUHJvamVjdCk8L2M+IGhhcyB0byBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIHRvDQotICogbm90aWZ5IHRoZSBoYW5kbGVyIGZvciBlYWNoIHByb2plY3QgYmVpbmcgcHJvY2Vzc2VkLiBUaGUgY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHdpbGwgYmUgZmlyc3Qgbm90aWZpZWQgdGhhdCB0aGUgcHJvY2Vzc2luZw0KLSAqIG9mIGdpdmVuIHByb2plY3QgaGFzIGJlZ2FuIGFuZCBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGl0IHdpbGwgYmUgbm90aWZpZWQgZm9yIGFsbCBhbm5vdGF0aW9ucyBpbiB0aGlzIHByb2plY3QgZGlzY292ZXJlZCBieQ0KLSAqIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbi4gDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JLyoqDQotCSAqIFN0YXJ0cyB0aGUgdHJhdmVyc2FsIG9mIGNvbXBpbGF0aW9uIHVuaXRzDQotCSAqIEBwYXJhbSBtb25pdG9yIC0gdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgdGhlIHRyYXZlcnNhbC4NCi0JICogQHBhcmFtIGN1SGFuZGxlciAtIGNvbXBpbGF0aW9uIHVuaXQgaGFuZGxlciB0byBiZSBub3RpZmllZCBmb3IgYSBnaXZlbiBwcm9qZWN0DQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAtIHRocm93biBpZiB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgdHJhdmVyc2luZyBhbm5vdGF0aW9ucw0KLQkgKi8NCi0JcHVibGljIHZvaWQgZmluZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb21waWxhdGlvblVuaXRIYW5kbGVyIGN1SGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lDb21waWxhdGlvblVuaXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzYTMxNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JQ29tcGlsYXRpb25Vbml0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi0NCi0vKioNCi0gKiBBIGxpc3RlbmVyIGZvciBldmVudHMgaXNzZXVkIGJ5IGFuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlIGR1cmluZyBjb21waWxhdGlvbiB1bml0IHRyYXZlcnNhbHMNCi0gKiANCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi17DQotCS8qKg0KLQkgKiBjYWxsZWQgYnkgdGhlIDxjPntAbGluayBJQ29tcGlsYXRpb25Vbml0RmluZGVyfTwvYz4gaW5zdGFuY2Ugd2hlbiBpdCBoYXMgc3RhcnRlZCB0byB0cmF2ZXJzZSB0aGUgYW5ub3RhdGlvbiBzZXQuIEFsbCBjYWxscyB0byA8Yz5oYW5kbGUoLi4uKTwvYz4NCi0JICogbWV0aG9kcyBpcyBpbnNpZGUgYSBzdGFydGVkLWZpbmlzaGVkIGJsb2NrLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnRlZCgpOw0KLQ0KLQkvKioNCi0JICogY2FsbGVkIGJ5IHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHRvIHRyYXZlcnNlIHRoZSBhbm5vdGF0aW9uIHNldC4NCi0JICovDQotCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCk7DQotDQotCS8qKg0KLQkgKiBDYWxsZWQgd2hlbiB0aGUgPGM+e0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9PC9jPiBpbnN0YW5jZSBmb3VuZCBhIGNvbXBpbGF0aW9uIHVuaXQuIFRoaXMgbWV0aG9kIGlzIGF3bGF5cyBjYWxsZWQgYWZ0ZXIgYSBjYWxsIHRvIDxjPntAbGluayAjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoZSByZXBvcnRlZCBjb21waWxhdGlvbiB1bml0IGlzIGd1YXJhbnRlZWQgdG8gYmUgZm91bmQgaW5zaWRlIHRoZSA8Yz5KYXZhUHJvamVjdDwvYz4gcmVwb3J0ZWQgYnkgdGhlIGxhc3QgY2FsbCB0byA8Yz57QGxpbmsjaGFuZGxlKEphdmFQcm9qZWN0KSBoYW5kbGUoSmF2YVByb2plY3QpfTwvYz4uDQotCSAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZWFjaCBjb21waWxhdGlvbiB1bml0DQotCSAqIA0KLQkgKiBAcGFyYW0gY3UgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJQ29tcGlsYXRpb25Vbml0IGN1KTsNCi0NCi0JLyoqDQotCSAqIENhbGxlZCB3aGVuIHRoZSA8Yz57QGxpbmsgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcn08L2M+IGluc3RhbmNlIGZvdW5kIGEgamF2YSBwcm9qZWN0LiBUaGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSB0aGUgPGM+e0BsaW5rICNoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCl9PC9jPg0KLQkgKiBmb3IgYW55IGNvbXBpbGF0aW9uIHVuaXQgZm91bmQgaW4gdGhpcyBwcm9qZWN0LiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgZm9yIGVhY2ggZm91bmQgcHJvamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBqcHJqIC0NCi0JICogICAgICAgICAgICB0aGUgamF2YSBwcm9qZWN0IGZvdW5kIGJ5IHRoZSBmaW5kZXINCi0JICovDQotCXB1YmxpYyB2b2lkIGhhbmRsZShJSmF2YVByb2plY3QganByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSU1vZGVsRWxlbWVudFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUwMGZjNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JTW9kZWxFbGVtZW50U3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpOw0KLQlwdWJsaWMgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSgpOwkNCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCk7DQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCk7DQotCXB1YmxpYyBEb21GYWN0b3J5IGRvbUZhY3RvcnkoKTsJDQotCXB1YmxpYyBJSmF2YU1vZGVsIGphdmFNb2RlbCgpOwkNCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9JUHJvamVjdFNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjVhZDVmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0lQcm9qZWN0U2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotDQotLyoqDQotICogU3BlY2lmaWVzIHdoYXQgamF2YSBwcm9qZWN0cyB3aWxsIGJlIHRyYXZlcnNlZCBieSBhIGdpdmVuIDxjPklDb21waWxhdGlvblVuaXRGaW5kZXI8L2M+IGluc3RhbmNlLiBJZiBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQNCi0gKiBzZWxlY3RvcnMgYXBwcm92ZWQgdGhlIHByb2plY3QgaS5lLiA8Yz5JUHJvamVjdFNlbGVjdG9yLmFwcHJvdmUoSUphdmFQcm9qZWN0KTwvYz4gcmV0dXJuZWQgdHJ1ZSwgdGhlbiB0aGlzIHByb2plY3Qgd2lsbA0KLSAqIGJlIHRyYXZlcnNlZC4gSS5lLiB0aGUgcHJvamVjdCBuZWVkcyB0byBiZSByZWplY3RlZCBieSBhbGwgdGhlIHNlbGVjdG9ycyBpbiBvcmRlciBub3QgdG8gYmUgdHJhdmVyc2VkLg0KLSAqIA0KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCByZWplY3QgYSBwcm9qZWN0IHRoYXQgaXQgaGFzIG5vIGtub3dsZWRnZSBhYm91dC4NCi0gKiBAYXV0aG9yIEhyaXN0byBTYWJldg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJUHJvamVjdFNlbGVjdG9yDQotew0KLQkvKioNCi0JICogQXBwcm92ZXMgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGZvciB0cmF2ZXJzYWwNCi0JICogQHBhcmFtIHByaiAtIHRoZSBwcm9qZWN0IHRvIGFwcHJvdmUgb3IgcmVqZWN0DQotCSAqIEByZXR1cm4gLSB0cnVlIGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB0cmF2ZXJzZWQgYWNjb3JkaW5nIHRvIHRoaXMgc2VsZWN0b3IsIGZhbHNlIG90aGVyd2lzZS4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaik7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGI5ZDc3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzRGVmYXVsdHNDYWxjdWxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi0vKioNCi0gKiBDb250YWlucyB1dGlsaXR5IG1ldGhvZHMgZm9yIGNhbGN1bGF0aW5nIGRlZmF1bHQgdmFsdWVzIG9mIHNvbWUgYXR0cmlidXRlcy9wcm9wZXJ0aWVzIGluIA0KLSAqIGFubm90YXRpb25zIGFuZCBET00gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRyA9ICJhcmciOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVRVUk4gPSAicmV0dXJuIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiUmVzcG9uc2UiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgU09BUEJpbmRpbmdTdHlsZS4gSWYgdGhlcmUgaXMgYSB2YWx1ZSBmb3Igc3R5bGUgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBzYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IHNiQW5ub3RhdGlvbiE9bnVsbCA/IHNiQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYgKHZhbHVlIT1udWxsICYmIFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZS50cmltKCkpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nU3R5bGUuUlBDOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciB1c2UgYXR0cmlidXRlIGluIDxjb2RlPnNiQW5ub3RhdGlvbjwvY29kZT4gcmV0dXJucyB0aGF0IHZhbHVlDQotCSAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8NCi0JcHVibGljIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHNiQW5ub3RhdGlvbikgew0KLQkJZmluYWwgU3RyaW5nIHZhbHVlID0gc2JBbm5vdGF0aW9uIT1udWxsID8gc2JBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoU0JBbm5vdGF0aW9uRmVhdHVyZXMuVVNFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1VzZS5FTkNPREVEOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIFNPQVBCaW5kaW5nVXNlLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGZvciBwYXJhbWV0ZXJTdHlsZSBhdHRyaWJ1dGUgaW4gPGNvZGU+c2JBbm5vdGF0aW9uPC9jb2RlPiANCi0JICogcmV0dXJucyB0aGF0IHZhbHVlIG90aGVyd2lzZSByZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHNiQW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIHRoZSBzdHlsZQ0KLQkgKi8JDQotCXB1YmxpYyBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIGRlZmluZVNCUGFyYW1ldGVyU3R5bGUoZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gc2JBbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFsdWUgPSBzYkFubm90YXRpb24hPW51bGwgPyBzYkFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShTQkFubm90YXRpb25GZWF0dXJlcy5QQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFKSA6IG51bGw7DQotCQlpZiAodmFsdWUhPW51bGwgJiYgU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUudHJpbSgpKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCQl9DQotCQkNCi0JCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7CQkNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjQgLSBXZWJQYXJhbSBuYW1lDQotCSAqIGF0dHJpYnV0ZSAgDQotCSAqIEBwYXJhbSB3ZWJNZXRob2QgdGhlIG1ldGhvZCBob2xkaW5nIHRoZSBwYXJhbWV0ZXINCi0JICogQHBhcmFtIHBhcmFtUG9zaXRpb24gdGhlIHBhcmFtZXRlciBwb3NpdGlvbiBpbiBtZXRob2QgYXJndW1lbnRzIGxpc3Qgc3RhcnRpbmcgd2l0aCAwDQotCSAqIEByZXR1cm4gY2FsY3VsYXRlZCBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJg0KLQkJICAgd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFKSANCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIEFSRyArIHBhcmFtUG9zaXRpb247IA0KLQl9DQotCQ0KLQkvKioNCi0JICogRGVmaW5lcyB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGFyYW1ldGVyIG5hbWUgYWNjb3JkaW5nIHRvIEpTUi0xODEgcG9pbnQgNC40IC0gV2ViUGFyYW0gbmFtZQ0KLQkgKiBhdHRyaWJ1dGUgDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2Qpd2ViUGFyYW0uZUNvbnRhaW5lcigpOw0KLQkJcmV0dXJuIGNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYk1ldGhvZCwgZ2V0UGFyYW1Qb3NpdGlvbih3ZWJNZXRob2QsIHdlYlBhcmFtKSk7CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIDxjb2RlPnBhcmFtPC9jb2RlPiBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IHNpZ25hdHVyZSBzdGFydGluZyBmcm9tIDANCi0JICogQHBhcmFtIHdlYk1ldGhvZA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHJldHVybiB0aGUgcGFyYW0gcG9zaXRpb24NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT53ZWJNZXRob2Q8L2NvZGU+IGRvZXMgbm90IGNvbnRhaW4gPGNvZGU+cGFyYW08L2NvZGU+DQotCSAqLw0KLQlwcm90ZWN0ZWQgaW50IGdldFBhcmFtUG9zaXRpb24oZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QsIGZpbmFsIElXZWJQYXJhbSBwYXJhbSkNCi0Jew0KLQkJaW50IHBvc2l0aW9uID0gMDsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYgKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJyZXR1cm4iKSkgey8vJE5PTi1OTFMtMSQNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWlmICh3ZWJQYXJhbT09cGFyYW0pIHsNCi0JCQkJcmV0dXJuIHBvc2l0aW9uOw0KLQkJCX0NCi0JCQkNCi0JCQlwb3NpdGlvbisrOw0KLQkJfQ0KLQkJDQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQYXJhbWV0ZXJbIiArIHBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkgKyAiXSB3YXMgbm90IGZvdW5kIGluIG1ldGhvZCBbIiArIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpICsgIl0iKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMyQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIERlZmluZXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIHBhcmFtZXRlciBuYW1lIGFjY29yZGluZyB0byBKU1ItMTgxIHBvaW50IDQuNCAtIFdlYlBhcmFtIHRhcmdldCBOUy4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0NCi0JICogQHJldHVybiBjYWxjdWxhdGVkIE5TDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZih3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkgICB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQgJiYNCi0JCSAgICF3ZWJQYXJhbS5pc0hlYWRlcigpKSANCi0JCXsNCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldFRhcmdldE5hbWVzcGFjZSgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBraW5kIGZvciB3ZWIgcGFyYW1ldGVycyAtIHJldHVybnMge0BsaW5rIFdlYlBhcmFtS2luZCNJTn0NCi0JICovDQotCXB1YmxpYyBXZWJQYXJhbUtpbmQgZ2V0RGVmYXVsdFBhcmFtS2luZCgpIHsNCi0JCXJldHVybiBXZWJQYXJhbUtpbmQuSU47CQkNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gZmFsc2UgYmVjYXVzZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgV2ViUGFyYW0oaGVhZGVyKSBpcyBmYWxzZQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdFBhcmFtSW5IZWRhZXIoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwYXJhbWV0ZXIgbmFtZSBhY2NvcmRpbmcgdG8gSlNSLTE4MSBwb2ludCA0LjUgLSBXZWJSZXN1bHQgbmFtZS4NCi0JICogQHBhcmFtIHdlYk1ldGhvZCB0aGUgbWV0aG9kIGhvbGRpbmcgdGhlIHBhcmFtZXRlcg0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8JDQotCXB1YmxpYyBTdHJpbmcgY2FsY1dlYlJlc3VsdERlZmF1bHROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKSANCi0Jew0KLQkJaWYod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCAmJiANCi0JCSAgIHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRSkNCi0JCXsNCi0JCQlyZXR1cm4gd2ViTWV0aG9kLmdldE5hbWUoKSArIFJFU1BPTlNFOyANCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIFJFVFVSTjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL0pheFdzV29ya3NwYWNlUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDk1Y2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYy5Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jLk9uRXZlbnRNb2RlbFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmZhY2V0cy5JRmFjZXRVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuSUxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLQ0KLS8qKg0KLSAqIFJlcHJlc2VudHMgdGhlIHJlc291cmNlIGZvciBKQVgtV1Mgd2ViIHNlcnZpY2UgRE9NIG1vZGVsLiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSANCi0gKiBtb2RlbC4gSXQgaXMgY2FwYWJsZSB0byB1c2Uge0BsaW5rIElQcm9ncmVzc01vbml0b3J9IHRvIHRyYWNrIHByb2dyZXNzIGFuZCBjYW5jZWwgcmVxdWVzdHMuDQotICogDQotICogQGF1dGhvciANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSBleHRlbmRzIE5vblN0cmVhbVJlc291cmNlDQotew0KLQlwcml2YXRlIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsOw0KLQlwcml2YXRlIGZpbmFsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGE7DQotCXByaXZhdGUgZmluYWwgT25FdmVudE1vZGVsU3luY2hyb25pemVyIG1vZGVsU3luY2hyb25pemVyOw0KLQlwcml2YXRlIGZpbmFsIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSBzZXJpYWxpemVyRmFjdG9yeTsgDQotDQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOw0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIHNhdmVFbmFibGVkOw0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZENuYWNlbGVkOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIGphdmFNb2RlbA0KLQkgKi8NCi0JcHVibGljIEpheFdzV29ya3NwYWNlUmVzb3VyY2UoZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpDQotCXsNCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJc2VydmljZURhdGEgPSBuZXcgU2VydmljZU1vZGVsRGF0YSgpOw0KLQkJbW9kZWxTeW5jaHJvbml6ZXIgPSBuZXcgT25FdmVudE1vZGVsU3luY2hyb25pemVyKHRoaXMsIHNlcnZpY2VEYXRhKTsNCi0JCXNhdmVFbmFibGVkID0gdHJ1ZTsNCi0JCXNlcmlhbGl6ZXJGYWN0b3J5ID0gbmV3IFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeSh0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0IHByb2dyZXNzIG1vbml0b3IgaW4gY2FzZSB0aGUgcHJvY2Vzc2luZyBwcm9ncmVzcyBzaG91bGQgYmUgdHJhY2tlZCBhbmQNCi0JICogYWxzbyBpbiBjYXNlIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHByb2Nlc3NpbmcgY2FuIGJlIGNhbmNlbGVkIA0KLQkgKiBAcGFyYW0gcG0gdGhlIG1vbml0b3IgLSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHBtKQ0KLQl7DQotCQl0aGlzLm1vbml0b3IgPSBwbTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbG9hZGVkIERPTSBpbiBjYXNlIGl0IGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIGluIGNhc2UgbG9hZGluZyBoYXMgbm90IGJlZW4gc3RhcnRlZCBhdCBhbGwgb3IgaW4gY2FzZSBsb2FkaW5nIGhhcyBiZWVuIGNhbmNlbGVkLiBUbyBjaGVjayBpZiB0aGUNCi0JICogbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBjYWxsIGlzTG9hZGluZ0NhbmNlbGVkKCkuDQotCSAqLw0KLQlwdWJsaWMgSURPTSBnZXRET00oKQ0KLQl7DQotCQlpZiAoZ2V0Q29udGVudHMoKS5zaXplKCkgPT0gMCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gKElET00pIGdldENvbnRlbnRzKCkuZ2V0KDApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIEphdmEgZWxlbWVudHMgaW4gb3JkZXIgdG8ga2VlcCB0aGUgbW9kZWwgaW4gc3luYw0KLQkgKiB3aXRoIHRoZXNlIGNoYW5nZXMNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIsIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUgfCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyBsaXN0ZW5lciBmb3IgY2hhbmdlcyB0byBKYXZhIGVsZW1lbnRzLiBLZWVwIGluIG1pbmQgdGhhdCBhZnRlciBjYWxsaW5nDQotCSAqIHRoaXMgbWV0aG9kIGNoYW5nZXMgaW4gamF2YSBlbGVtZW50cyB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gRE9NIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9wU3luY2hyb25pemluZygpDQotCXsNCi0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIobW9kZWxTeW5jaHJvbml6ZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBsb2dnZXIgdG8gdXNlIHdoZW4gc29tZSBldmVudCBuZWVkcyB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBqYXZhIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gamF2YU1vZGVsOw0KLQl9CQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgZG9Mb2FkKGZpbmFsIE1hcDw/LCA/PiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJbG9hZENuYWNlbGVkID0gZmFsc2U7DQotCQlnZXRDb250ZW50cygpLmNsZWFyKCk7DQotDQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oZmluYWwgSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJdHJ5IA0KLQkJCQl7CQkNCi0JCQkJCW5ldyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS50aGlzLCBzZXJ2aWNlRGF0YSkubG9hZChvcHRpb25zLCBzdWJNb25pdG9yKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWxvYWRDbmFjZWxlZCA9IHRydWU7DQotCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSkFYIFdTIFdlYiBTZXJ2aWNlcyBET00gbG9hZGluZyBoYXMgYmVlbiBjYW5jZWxlZCBieSB0aGUgdXNlciwgc29tZSBKQVggV1MgV2ViIFNlcnZpY2VzIGZ1bmN0aW9uYWxpdGllcyB3b24ndCBiZSBhdmFpbGFibGUiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlqYXZhTW9kZWwoKS5nZXRXb3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotCQkJdGhyb3cgbmV3IElPV3JhcHBlZEV4Y2VwdGlvbihjZSk7DQotCQl9DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgl7DQotCQkvLyBubyBwcm9jZXNzaW5nIG5lZWRlZA0KLQl9DQotDQotCXByb3RlY3RlZCBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciBnZXRTeW5jaHJvbml6aW5nTGlzdGVuZXIoKSB7DQotCQlyZXR1cm4gbW9kZWxTeW5jaHJvbml6ZXI7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBpbGF0aW9uIHVuaXQgZmluZGVyIHRoYXQgY3Jhd2xzIHRocm91Z2ggamF2YU1vZGVsIGFuZCBjYWxscyANCi0JICogY29tcGlsYXRpb24gdW5pdCBoYW5kbGVyIHRvIHByb2Nlc3MgYXZhaWxhYmxlIENVJ3MgDQotCSAqIEBwYXJhbSBqTW9kZWwNCi0JICogQHBhcmFtIHByb2plY3RTZWxlY3RvcnMNCi0JICogQHJldHVybiBub24gPGNvZGU+bnVsbDwvY29kZT4ge0BsaW5rIElDb21waWxhdGlvblVuaXRGaW5kZXJ9IGluc3RhbmNlIA0KLQkgKi8NCi0JcHVibGljIElDb21waWxhdGlvblVuaXRGaW5kZXIgbmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKGZpbmFsIElKYXZhTW9kZWwgak1vZGVsLCBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gcHJvamVjdFNlbGVjdG9ycykNCi0Jew0KLQkJcmV0dXJuIG5ldyBXb3Jrc3BhY2VDVUZpbmRlcihqTW9kZWwsIHByb2plY3RTZWxlY3RvcnMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBcHByb3ZlcyB0aGF0IDxjb2RlPnByajwvY29kZT4gaXMgSkFYLVdTIHdlYiBzZXJ2aWNlIGVuYWJsZWQgDQotCSAqIEBwYXJhbSBwcmoNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHRoaXMgcHJvamVjdCBtaWdodCBjb250YWluIEpBWC1XUyB3ZWIgc2VydmljZXMNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGFwcHJvdmVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmopDQotCXsNCi0JCWZpbmFsIElGYWNldFV0aWxzIGZhY2V0VXRpbHMgPSBuZXcgRmFjZXRVdGlscygpOw0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gZmFjZXRVdGlscy5oYXNGYWNldFdpdGhWZXJzaW9uKHByai5nZXRQcm9qZWN0KCksIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX1ZFUlNJT04sIEZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX0lELCB0cnVlKQ0KLQkJCQl8fCBmYWNldFV0aWxzLmhhc0ZhY2V0V2l0aFZlcnNpb24ocHJqLmdldFByb2plY3QoKSwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfVkVSU0lPTiwgRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfSUQsIHRydWUpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHJlYWQgZmFjZXQgb24gcHJvamVjdCAiICsgcHJqLmdldEVsZW1lbnROYW1lKCkgKyAiLiBBbnkgV2ViIFNlcnZpY2UgZWxlbWVudHMgaW4gdGhpcyBwcm9qZWN0IHdpbGwgbm90IGJlIHNob3duIGluIHRoZSBuYXZpZ2F0aW9uIHRyZWUiLCBjZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJQW5ub3RhdGlvbkluc3BlY3Rvcn0gZm9yIDxjb2RlPnR5cGU8L2NvZGU+DQotCSAqIEBwYXJhbSB0eXBlDQotCSAqIEByZXR1cm4gbm9uIDxjb2RlPm51bGw8L2NvZGU+IGluc3BlY3Rvcg0KLQkgKi8NCi0JcHVibGljIElBbm5vdGF0aW9uSW5zcGVjdG9yIG5ld0Fubm90YXRpb25JbnNwZWN0b3IoZmluYWwgSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IodHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbm9uIGVtcHR5IGFycmF5IG9mIHByb2plY3RzIHNlbGVjdG9ycyByZXNwb25zaWJsZSBmb3IgZmlsdGVyaW5nIHByb2Nlc3NlZCBwcm9qZWN0cyANCi0JICovDQotCXB1YmxpYyBJUHJvamVjdFNlbGVjdG9yW10gZ2V0UHJvamVjdFNlbGVjdG9ycygpDQotCXsNCi0JCXJldHVybiBuZXcgSVByb2plY3RTZWxlY3RvcltdIHsgbmV3IElQcm9qZWN0U2VsZWN0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikNCi0JCQl7DQotCQkJCXJldHVybiBhcHByb3ZlUHJvamVjdChwcmopOw0KLQkJCX0NCi0JCX0gfTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgc2VyaWFsaXplciBmYWN0b3J5IHVzZWQgdG8gYWRhcHQgRE9NIG9iamVjdHMgd2l0aCBzZXJpYWxpemVyIGFkYXB0ZXJzICANCi0JICovDQotCXB1YmxpYyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZ2V0U2VyaWFsaXplckZhY3RvcnkoKSB7DQotCQlyZXR1cm4gc2VyaWFsaXplckZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNhdmluZyBpcyBlbmFibGVkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVFbmFibGVkKCkgew0KLQkJcmV0dXJuIHNhdmVFbmFibGVkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHRvIGVuYWJsZSBzYXZpbmcgb2YgbW9kZWwgb2JqZWN0cyB0byB1bmRlcmx5aW5nIHJlc291cmNlcw0KLQkgKi8NCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGVuYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSB0cnVlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogY2FsbCB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIHNhdmluZyBvZiBtb2RlbCBvYmplY3RzIHRvIHVuZGVybHlpbmcgcmVzb3VyY2VzDQotCSAqLw0KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgZGlzYWJsZVNhdmluZygpIHsNCi0JCXRoaXMuc2F2ZUVuYWJsZWQgPSBmYWxzZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGUgbG9hZCBvZiBET00gbW9kZWwgaGFzIGJlZW4gY2FuY2VsZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTG9hZENuYWNlbGVkKCkgew0KLQkJcmV0dXJuIGxvYWRDbmFjZWxlZDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEhvbGRzIG1vZGVsIGRhdGEgaGVscGZ1bCBpbiBtb2RlbCBwcm9jZXNzaW5nDQotCSAqLw0KLQlwdWJsaWMgY2xhc3MgU2VydmljZU1vZGVsRGF0YQ0KLQl7DQotCQlwcml2YXRlIE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPiB3czJzZWkgPSBuZXcgSGFzaE1hcDxJV2ViU2VydmljZSwgU3RyaW5nPigpOw0KLQ0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4gc2VpMndzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPj4oKTsNCi0NCi0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0Pj4gdHlwZTJpbmhlcml0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248SUNvbXBpbGF0aW9uVW5pdD4+KCk7DQotDQotCQlwdWJsaWMgdm9pZCBtYXAoSVdlYlNlcnZpY2Ugd3MsIFN0cmluZyBzZWlJbXBsKQ0KLQkJew0KLQkJCXdzMnNlaS5wdXQod3MsIHNlaUltcGwpOw0KLQkJCWdldEltcGxlbWVudGluZ1dzKHNlaUltcGwpLmFkZCh3cyk7DQotCQl9DQotDQotCQlTdHJpbmcgZ2V0U2VpSW1wbChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlyZXR1cm4gd3Myc2VpLmdldCh3cyk7DQotCQl9DQotDQotCQlwdWJsaWMgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gZ2V0SW1wbGVtZW50aW5nV3MoU3RyaW5nIHNlaUltbCkNCi0JCXsNCi0JCQlDb2xsZWN0aW9uPElXZWJTZXJ2aWNlPiB3c3MgPSBzZWkyd3MuZ2V0KHNlaUltbCk7DQotCQkJaWYgKHdzcyA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJd3NzID0gbmV3IEFycmF5TGlzdDxJV2ViU2VydmljZT4oKTsNCi0JCQkJc2VpMndzLnB1dChzZWlJbWwsIHdzcyk7DQotCQkJfQ0KLQkJCXJldHVybiB3c3M7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCB1bm1hcChJV2ViU2VydmljZSB3cykNCi0JCXsNCi0JCQlmaW5hbCBTdHJpbmcgc2VpID0gd3Myc2VpLnJlbW92ZSh3cyk7DQotCQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViU2VydmljZT4gaW1wbGVtZW50aW5nV2ViU2VydmljZXMgPSBnZXRJbXBsZW1lbnRpbmdXcyhzZWkpOw0KLQkJCWltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnJlbW92ZSh3cyk7DQotCQkJaWYgKGltcGxlbWVudGluZ1dlYlNlcnZpY2VzLnNpemUoKSA9PSAwKQ0KLQkJCXsNCi0JCQkJc2VpMndzLnJlbW92ZShzZWkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHJlY29yZEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lLCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGluaGVyaXRlZFR5cGVzKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnB1dChmcU5hbWUsIGluaGVyaXRlZFR5cGVzKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQHBhcmFtIGZxTmFtZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUNCi0JCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBjbGFzc2VzIHRoYXQgYXJlIHN1cGVyIGZvciBjbGFzcyA8Y29kZT5mcU5hbWU8L2NvZGU+DQotCQkgKi8NCi0JCXB1YmxpYyBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGdldEhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXJldHVybiB0eXBlMmluaGVyaXRlZC5nZXQoZnFOYW1lKTsNCi0JCX0NCi0NCi0JCS8qKg0KLQkJICogQ2xlYXJzIHJlY29yZGVyIGhpZXJhcmNoeSBmb3IgY2xhc3Mgd2l0aCBGUU5hbWUgPGNvZGU+ZnFOYW1lPC9jb2RlPg0KLQkJICogQHBhcmFtIGZxTmFtZQ0KLQkJICovDQotCQlwdWJsaWMgdm9pZCBjbGVhckhpZXJhcmNoeShTdHJpbmcgZnFOYW1lKQ0KLQkJew0KLQkJCXR5cGUyaW5oZXJpdGVkLnJlbW92ZShmcU5hbWUpOw0KLQkJfQ0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvSmVlNVdzRG9tUnVudGltZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhmMTJkMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9KZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV3NEb21Mb2FkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLXB1YmxpYyBjbGFzcyBKZWU1V3NEb21SdW50aW1lRXh0ZW5zaW9uIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUV4dGVuc2lvbg0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5qZWU1IjsvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIExpc3Q8SVdzRG9tTG9hZExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElXc0RvbUxvYWRMaXN0ZW5lcj4oKTsNCi0JcHJpdmF0ZSBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHdvcmtzcGFjZVJlc291cmNlOw0KLQlwcml2YXRlIGJvb2xlYW4gZmluaXNoZWQ7DQotCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkOw0KLQ0KLQlwdWJsaWMgdm9pZCBjcmVhdGVET00oZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCUpvYi5nZXRKb2JNYW5hZ2VyKCkuYmVnaW5SdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIG1vbml0b3IpOw0KLQkJdHJ5IHsNCi0JCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCB8fCB3b3Jrc3BhY2VSZXNvdXJjZS5pc0xvYWRDbmFjZWxlZCgpKSB7CQkJDQotCQkJCXBlcmZvcm1Mb2FkKG1vbml0b3IpOw0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5lbmRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwZXJmb3JtTG9hZChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gDQotCXsNCi0JCXdvcmtzcGFjZVJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoKTsNCi0JCXdvcmtzcGFjZVJlc291cmNlLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsNCi0JCXRyeSB7DQotCQkJc3RhcnRlZCgpOw0KLQkJCXdvcmtzcGFjZVJlc291cmNlLmxvYWQobnVsbCk7DQotCQkJaWYgKHdvcmtzcGFjZVJlc291cmNlLmlzTG9hZENuYWNlbGVkKCkpIHsNCi0JCQkJdGhyb3cgY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWZpbmlzaGVkKCk7DQotCQl9DQotCQkNCi0JCXdvcmtzcGFjZVJlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOw0KLQl9DQotDQotCXB1YmxpYyBJRE9NIGdldERPTSgpIHRocm93cyBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlpZiAod29ya3NwYWNlUmVzb3VyY2UuaXNMb2FkQ25hY2VsZWQoKSkgew0KLQkJCXRocm93IGNyZWF0ZUNhbmNlbGVkRXhjZXB0aW9uKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3b3Jrc3BhY2VSZXNvdXJjZS5nZXRET00oKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkTG9hZExpc3RlbmVyKElXc0RvbUxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKGxpc3RlbmVyLCAibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCQl9DQotCQkNCi0JCWlmIChzdGFydGVkKSB7DQotCQkJbGlzdGVuZXIuc3RhcnRlZCgpOwkJCQ0KLQkJfQ0KLQkJDQotCQlpZiAoZmluaXNoZWQpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOwkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVMb2FkTGlzdGVuZXIoSVdzRG9tTG9hZExpc3RlbmVyIGxpc3RlbmVyKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0obGlzdGVuZXIsICJsaXN0ZW5lciIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElKYXZhTW9kZWwgamF2YU1vZGVsKCkgew0KLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7IA0KLQkJcmV0dXJuIG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKGphdmFNb2RlbCgpKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSANCi0Jew0KLQkJZmluaXNoZWQgPSB0cnVlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5maW5pc2hlZCgpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0ZWQoKSANCi0Jew0KLQkJc3RhcnRlZCA9IHRydWU7DQotCQlmaW5pc2hlZCA9IGZhbHNlOw0KLQkJZm9yIChJV3NEb21Mb2FkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lci5zdGFydGVkKCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24gY3JlYXRlQ2FuY2VsZWRFeGNlcHRpb24oKSB7DQotCQlyZXR1cm4gbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvTm9uU3RyZWFtUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY2YTVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL05vblN0cmVhbVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbDsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9uU3RyZWFtUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZUltcGwgew0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyBSZXNvdXJjZSBpcyBub3Qgc3RyZWFtIGJhc2VkLCB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLg0KLQkgKiBJZiBjYWxsZWQgaXQgd2lsbCB0aHJvdyA8Yz5VbnN1cHBvcnRlZEV4Y2VwdGlvbjwvYz4NCi0JICogQHBhcmFtIGFyZzAgLSBpZ25vcnJlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGRvTG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXN1cGVyLmRvTG9hZChpbnB1dFN0cmVhbSwgb3B0aW9ucyk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTaW5jZSB0aGlzIFJlc291cmNlIGlzIG5vdCBzdHJlYW0gYmFzZWQsIHRoaXMgbWV0aG9kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuDQotCSAqIElmIGNhbGxlZCBpdCB3aWxsIHRocm93IDxjPlVuc3VwcG9ydGVkRXhjZXB0aW9uPC9jPg0KLQkgKiBAcGFyYW0gYXJnMCAtIGlnbm9ycmVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBhcmcwLCBNYXA8Pyw/PiBhcmcxKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJc3VwZXIuZG9TYXZlKGFyZzAsIGFyZzEpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uIFN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZXNvdXJjZS4NCi0JICogQHJldHVybiBub3RoaW5nLiB0aGlzIG1ldGhvZCBhbGx3YXlzIHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0NvbnRlbnRaaXBFbnRyeShaaXBFbnRyeSBhcmcwKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIFppcEVudHJ5IG5ld0NvbnRlbnRaaXBFbnRyeSgpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2luY2UgdGhpcyByZXNvdXJjZSBkb2Vzbid0IHN1cHBvcnQgc3RyZWFtcyB0aGlzIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiBBbGx3YXN5IHRocm93cyA8Yz5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvYz4uDQotCSAqIEByZXR1cm4gbm90aGluZy4gdGhpcyBtZXRob2QgYWxsd2F5cyB0aHJvd3MgPGM+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2M+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdXNlWmlwKCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIGxvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0JCWlmICghaXNMb2FkZWQoKSkgew0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQodHJ1ZSk7DQotCQkJaXNMb2FkaW5nID0gdHJ1ZTsNCi0JCQlpZiAoZXJyb3JzICE9IG51bGwpIHsNCi0JCQkJZXJyb3JzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7DQotCQkJCXdhcm5pbmdzLmNsZWFyKCk7DQotCQkJfQ0KLQkJCXRyeSB7DQotCQkJICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdExvYWRPcHRpb25zKTsNCi0JCQkJZG9Mb2FkKG1lcmdlZE9wdGlvbnMpOw0KLQkJCX0gZmluYWxseSB7DQotCQkJCQ0KLQkJCQlpc0xvYWRpbmcgPSBmYWxzZTsNCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7DQotCQkJCQllTm90aWZ5KG5vdGlmaWNhdGlvbik7DQotCQkJCX0NCi0JCQkJc2V0TW9kaWZpZWQoZmFsc2UpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBsb2FkIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSB0aHJvd24gaWYgZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgY29udGVudCBvZiB0aGlzIHJlc291cmNlDQotCSAqLw0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBkb0xvYWQoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmUoTWFwPD8sPz4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JICAgIGlmIChlcnJvcnMgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgZXJyb3JzLmNsZWFyKCk7DQotCSAgICB9DQotCSAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkNCi0JICAgIHsNCi0JICAgICAgd2FybmluZ3MuY2xlYXIoKTsNCi0JICAgIH0NCi0JICAgIE1hcDw/LD8+IG1lcmdlZE9wdGlvbnMgPSBtZXJnZU1hcHMob3B0aW9ucywgZGVmYXVsdFNhdmVPcHRpb25zKTsNCi0JICAgIGRvU2F2ZShtZXJnZWRPcHRpb25zKTsNCi0JICAgIHNldE1vZGlmaWVkKGZhbHNlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENhbGxlZCB0byBzYXZlIHRoZSByZXNvdXJjZSB1c2luZyBubyBzdHJlYW1zLg0KLQkgKiBAcGFyYW0gb3B0aW9ucyAtIG9wdGlvbnMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtZXRvZCB3aWxsIGlnbm9yZSBhbnkgb3B0aW9ucyB0aGF0IGl0IGRvZXNuJ3QgcmVjb2duaXplLiBUaGUga2V5cyBhbmQgdGhlIHZhbHVlcyBjYW4gYmUgYXJiaXRyYXJ5IG9iamVjdHMuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBpZiBwcm9ibGVtIGR1cmluZyB0aGUgc2F2aW5nIG9jY3VycmVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9TYXZlKE1hcDw/LD8+IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCi0JDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvU0JBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2E4MWZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1NCQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0vKioNCi0gKiBDb250YWlucyBTT0FQQmluZGluZyBhbm5vdGF0aW9uIG5hbWUsIGF0dHJpYnV0ZXMgYW5kIHBvc3NpYmxlIHZhbHVlcw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU0JBbm5vdGF0aW9uRmVhdHVyZXMgDQotew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUWUxFX0FUVFJJQlVURSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfQVRUUklCVVRFID0gInVzZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfU1RZTEVfQVRUUklCVVRFID0gInBhcmFtZXRlclN0eWxlIjsvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9ET0NVTUVOVCAJPSBTQl9BTk5PVEFUSU9OICsgIi5TdHlsZS5ET0NVTUVOVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQl9TVFlMRV9SUEMgCQk9IFNCX0FOTk9UQVRJT04gKyAiLlNPQVBCaW5kaW5nLlN0eWxlLlJQQyI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0xJVEVSQUwgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkxJVEVSQUwiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0JfVVNFX0VOQ09ERUQgCT0gU0JfQU5OT1RBVElPTiArICIuVXNlLkVOQ09ERUQiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9CQVJFIAkJPSBTQl9BTk5PVEFUSU9OICsgIi5QYXJhbWV0ZXJTdHlsZS5CQVJFIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVECT0gU0JfQU5OT1RBVElPTiArICIuUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JDQotCXByaXZhdGUgU0JBbm5vdGF0aW9uRmVhdHVyZXMoKSB7DQotCQkvLyBubyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGFsbG93ZWQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dNQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE0OTg5Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XTUFubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotcHVibGljIGZpbmFsIGNsYXNzIFdNQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9BTk5PVEFUSU9OID0gImphdmF4Lmp3cy5XZWJNZXRob2QiOy8vJE5PTi1OTFMtMSQNCi0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01fTkFNRV9BVFRSSUJVVEUgPSAib3BlcmF0aW9uTmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9FWENMVURFRF9BVFRSSUJVVEUgPSAiZXhjbHVkZSI7Ly8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIFdNQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvV1BBbm5vdGF0aW9uRmVhdHVyZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDdjMzJmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dQQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZTsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIG9uIGphdmF4Lmp3cy5XZWJQYXJhbSBhbm5vdGF0aW9uIG5hbWUgYW5kIGF0dHJpYnV0ZSBuYW1lcy4gDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLWZpbmFsIHB1YmxpYyBjbGFzcyBXUEFubm90YXRpb25GZWF0dXJlcyANCi17DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlBhcmFtIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVF9OQU1FX0FUVFJJQlVURSA9ICJwYXJ0TmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSA9ICJ0YXJnZXROYW1lc3BhY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERV9BVFRSSUJVVEUgPSAibW9kZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfQVRUUklCVVRFID0gImhlYWRlciI7Ly8kTk9OLU5MUy0xJA0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREUgPSAiamF2YXguandzLldlYlBhcmFtLk1vZGUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfSU4gPSBXRUJfUEFSQU1fTU9ERSArICIuSU4iOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1BBUkFNX01PREVfT1VUID0gV0VCX1BBUkFNX01PREUgKyAiLk9VVCI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUEFSQU1fTU9ERV9JTk9VVCA9IFdFQl9QQVJBTV9NT0RFICsgIi5JTk9VVCI7Ly8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dTQW5ub3RhdGlvbkZlYXR1cmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5ZjE1ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9XU0Fubm90YXRpb25GZWF0dXJlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2U7DQotDQotZmluYWwgcHVibGljIGNsYXNzIFdTQW5ub3RhdGlvbkZlYXR1cmVzDQotew0KLQlwcml2YXRlIFdTQW5ub3RhdGlvbkZlYXR1cmVzKCkNCi0Jew0KLQl9DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0FOTk9UQVRJT04gPSAiamF2YXguandzLldlYlNlcnZpY2UiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9BVFRSSUJVVEUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFID0gImVuZHBvaW50SW50ZXJmYWNlIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUgPSAic2VydmljZU5hbWUiOy8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NETF9MT0NBVElPTl9BVFRSSUJVVEUgPSAid3NkbExvY2F0aW9uIjsvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFID0gInRhcmdldE5hbWVzcGFjZSI7Ly8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05BTUVfQVRUUklCVVRFID0gInBvcnROYW1lIjsJLy8kTk9OLU5MUy0xJA0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL1dvcmtzcGFjZUNVRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkYzhmMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9Xb3Jrc3BhY2VDVUZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lTWVzc2FnZXM7DQotDQotcHVibGljIGNsYXNzIFdvcmtzcGFjZUNVRmluZGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEZpbmRlcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YU1vZGVsIGphdmFNb2RlbDsNCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzOw0KLQkNCi0JcHVibGljIFdvcmtzcGFjZUNVRmluZGVyKElKYXZhTW9kZWwgamF2YU1vZGVsLCBJUHJvamVjdFNlbGVjdG9yW10gc2VsZWN0b3JzKSB7DQotCQlpZiAoamF2YU1vZGVsID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuamF2YU1vZGVsID0gamF2YU1vZGVsOw0KLQkJaWYgKHNlbGVjdG9ycyA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJzZWxlY3RvciIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaW5kKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJY3VIYW5kbGVyLnN0YXJ0ZWQoKTsNCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQltb25pdG9yLmJlZ2luVGFzayhKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5KQVhXU19ET01fTE9BRElORywgYXNzdW1lV29yaygpKTsNCi0JCX0JCQ0KLQkJdHJ5IHsNCi0JCQlmb3IgKElKYXZhUHJvamVjdCBwcmogOiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3RzKCkpDQotCQkJew0KLQkJCQlpZiAobW9uaXRvciE9bnVsbCAmJiBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJdGhyb3cgbmV3IFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uKCJKQVgtV1MgRE9NIGxvYWRpbmcgY2FuY2VsZWQiLCBKYXhXc0RvbVJ1bnRpbWVNZXNzYWdlcy5Xb3Jrc3BhY2VDVUZpbmRlcl9MT0FESU5HX0NBTkNFTEVEKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCQ0KLQkJCQlpZiAoYXBwcm92ZShwcmopKQ0KLQkJCQl7DQotCQkJCQljdUhhbmRsZXIuaGFuZGxlKHByaik7DQotCQkJCQlwYXJzZVByb2plY3QocHJqLCBtb25pdG9yLCBjdUhhbmRsZXIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWN1SGFuZGxlci5maW5pc2hlZCgpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCW1vbml0b3IuZG9uZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGludCBhc3N1bWVXb3JrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvdW50aW5nQ1VIYW5kbGVyIGNvdW50aW5nSGFuZGxlciA9IG5ldyBDb3VudGluZ0NVSGFuZGxlcigpOw0KLQkJZm9yIChJSmF2YVByb2plY3QgcHJqIDogamF2YU1vZGVsLmdldEphdmFQcm9qZWN0cygpKSB7CQkNCi0JCQlpZiAoYXBwcm92ZShwcmopKSB7DQotCQkJCXBhcnNlUHJvamVjdChwcmosIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIGNvdW50aW5nSGFuZGxlcik7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gY291bnRpbmdIYW5kbGVyLmNvdW50Ow0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcmosIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXIgY3VIYW5kbGVyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiANCi0Jew0KLQkJZm9yIChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA6IHByai5nZXRQYWNrYWdlRnJhZ21lbnRzKCkpIA0KLQkJew0KLQkJCWlmIChwYWNrYWdlRnJhZ21lbnQuZ2V0S2luZCgpICE9IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlmb3IgKElDb21waWxhdGlvblVuaXQgY3UgOiBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0cygpKSANCi0JCQl7DQotCQkJCWlmIChtb25pdG9yIT1udWxsICYmIG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQl0aHJvdyBuZXcgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24oIkpBWC1XUyBET00gbG9hZGluZyBjYW5jZWxlZCIsSmF4V3NEb21SdW50aW1lTWVzc2FnZXMuV29ya3NwYWNlQ1VGaW5kZXJfTE9BRElOR19DQU5DRUxFRCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJY3VIYW5kbGVyLmhhbmRsZShjdSk7DQotCQkJCQ0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGFwcHJvdmUoSUphdmFQcm9qZWN0IHByaikgew0KLQkJZm9yIChJUHJvamVjdFNlbGVjdG9yIHNlbGVjdG9yIDogc2VsZWN0b3JzKSB7DQotCQkJaWYgKHNlbGVjdG9yLmFwcHJvdmUocHJqKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXIgY291bnRzIHRoZSBjb21waWxhdGlvbiB1bml0cyANCi0JICogIA0KLQkgKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotCSAqLw0KLQlwcm90ZWN0ZWQgY2xhc3MgQ291bnRpbmdDVUhhbmRsZXIgaW1wbGVtZW50cyBJQ29tcGlsYXRpb25Vbml0SGFuZGxlciANCi0Jew0KLQkJcHJpdmF0ZSBpbnQgY291bnQ7DQotCQkNCi0JCXB1YmxpYyB2b2lkIHN0YXJ0ZWQoKSB7DQotCQkJY291bnQgPSAwOw0KLQkJfQ0KLQkJDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJCWNvdW50Kys7DQotCQl9DQotCQkNCi0JCXB1YmxpYyB2b2lkIGZpbmlzaGVkKCkgeyAvKiBubyBwcm9jZXNzaW5nIG5lZWRlZCAqLyB9DQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoSUphdmFQcm9qZWN0IGpwcmopIHsgLyogbm8gcHJvY2Vzc2luZyBuZWVkZWQgKi8gfQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZlYWZhZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0Fubm90YXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsLkFubm90YXRpb25BZGFwdGVyOw0KLQ0KLS8qKg0KLSAqIEZhY3RvcnkgdGhhdCBhZGFwdHMgRE9NIG9iamVjdHMgdG8ge0BsaW5rIElBbm5vdGF0aW9uQWRhcHRlcn0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsDQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIC0gdXNlIHRoaXMgc3RhdGljIGluc3RhbmNlIHRvIGFkYXB0IG9iamVjdHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEFubm90YXRpb25BZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uQWRhcHRlckZhY3RvcnkoKSB7DQotCQkvLyBzaW5nbGV0b24NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiB0eXBlID09IElBbm5vdGF0aW9uQWRhcHRlci5jbGFzczsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIA0KLQl7DQotCQlyZXR1cm4gbmV3IEFubm90YXRpb25BZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL0lBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZjQyNzUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvYW5ub3RhdGlvbi9JQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBob2xkcyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGFubm90YXRpb25zIGFwcGxpZWQgb24gdGhlDQotICogamF2YSBhcnRpZmFjdC9zIHdoaWNoIGlzIHJlcHJlc2VudCBieSB0aGUgRE9NIG9iamVjdCBhZGFwdGVkIHRvIHRoaXMgaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQWRhcHRlciANCi17DQotCS8qKg0KLQkgKiBQcm92aWRlcyB0aGUge0BsaW5rIElBbm5vdGF0aW9ufSBmb3IgYW5ub3RhdGlvbiB3aXRoIDxjb2RlPmFubkZRTmFtZTwvY29kZT4uIA0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcmV0dXJuIGxvY2F0b3IgaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGV4aXN0aW5nDQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5uRlFOYW1lKTsNCi0JDQotCS8qKg0KLQkgKiBBZGRzIGFubm90YXRpb24gdG8gdGhlIGxpc3Qgb2YgdXNlZCBhbm5vdGF0aW9ucy4NCi0JICogPGNvZGU+YW5ub3RhdGlvbjwvY29kZT4gY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gdGhlIGxvY2F0b3IgZm9yIHRoaXMgYW5ub3RhdGlvbg0KLQkgKiBpcyByZW1vdmVkLg0KLQkgKiBAcGFyYW0gYW5uRlFOYW1lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiB0aCBhbm5vdGF0aW9uIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKFN0cmluZyBhbm5GUU5hbWUsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9hbm5vdGF0aW9uL2ltcGwvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWQ2ZmJiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2Fubm90YXRpb24vaW1wbC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5JQW5ub3RhdGlvbkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElMb2NhdG9yQWRhcHRlcn0uDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSUFubm90YXRpb25BZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+PiBhbm5vdGF0aW9uTG9jYXRvcnM7DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uQWRhcHRlcigpIHsNCi0JCWFubm90YXRpb25Mb2NhdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4+KCk7DQotCX0NCi0JDQotCXB1YmxpYyBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uRlFOYW1lKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvbkZRTmFtZSwgImFubm90YXRpb25GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gYW5ub3RhdGlvbkxvY2F0b3JzLmdldChhbm5vdGF0aW9uRlFOYW1lKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBhbm5GUU5hbWUsIGZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubm90YXRpb24pIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5GUU5hbWUsICJhbm5GUU5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlhbm5vdGF0aW9uTG9jYXRvcnMucHV0KGFubkZRTmFtZSwgYW5ub3RhdGlvbik7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL01ldGhvZFByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYzYjc0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9NZXRob2RQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotDQotLyoqDQotICogQWRhcHRlciB0aGF0IGdpdmVzIGRlZmF1bHQgdmFsdWVzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0cw0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzDQotew0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX05BTUU6DQotCQkJcmV0dXJuIGdldE1ldGhvZE5hbWUod2ViTWV0aG9kKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZUdldChmZWF0dXJlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2ROYW1lKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlpbnQgcG9zID0gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCkuaW5kZXhPZignKCcpOw0KLQkJaWYgKHBvcyA+IC0xKSB7DQotCQkJcmV0dXJuIHdlYk1ldGhvZC5nZXRJbXBsZW1lbnRhdGlvbigpLnN1YnN0cmluZygwLCBwb3MpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9QYXJhbWV0ZXJQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmI5ZTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzRGVmYXVsdHNDYWxjdWxhdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgZGVmaW5lcyB3aGljaCBwcm9wZXJ0aWVzIGZvciB7QGxpbmsgSVdlYlBhcmFtfSBhcmUgZWRpdGFibGUNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclByb3BlcnR5RGVmYXVsdHNBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlEZWZhdWx0cw0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjID0gbmV3IEpheFdzRGVmYXVsdHNDYWxjdWxhdG9yKCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi0JDQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkNCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlBhcmFtOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkgDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fTkFNRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHROYW1lKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJQYXJhbSk7CQkJDQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUygoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCksIHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19IRUFERVI6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1JbkhlZGFlcigpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0tJTkQ6DQotCQkJcmV0dXJuIGRlZkNhbGMoKS5nZXREZWZhdWx0UGFyYW1LaW5kKCk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3ZWJQYXJhbS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZDYWxjOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjODJiZTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2UvZGVmYXVsdHMvUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgZmFjdG9yeSBmb3IgYWRhcHRlcnMgaW1wbGVtZW50aW5nIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gaW50ZXJmYWNlLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkNCi17DQotCS8qKg0KLQkgKiBTaW5nbGV0b24gaW5zdGFuY2UgZm9yIHRoaXMgYWRhcHRlciBmYWN0b3J5IA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5KCk7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MgPT0gb2JqZWN0Ow0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG5ldyBXc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQkNCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgTWV0aG9kUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKXsNCi0JCXJldHVybiBuZXcgUGFyYW1ldGVyUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1NlaVByb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5Y2NhN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9TZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuZGVmYXVsdHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JUHJvcGVydHlEZWZhdWx0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IHByb3BlcnRpZXMgDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZWlQcm9wZXJ0eURlZmF1bHRzQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5RGVmYXVsdHMgDQotew0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX05BTUU6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5RlFOYW1lKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCX0JCQkNCi0JCQ0KLQkJcmV0dXJuIHNlaS5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9kZWZhdWx0cy9Xc1Byb3BlcnR5RGVmYXVsdHNBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDdhYzk0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL2RlZmF1bHRzL1dzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmRlZmF1bHRzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5RGVmYXVsdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7DQotDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eURlZmF1bHRzIA0KLXsNCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSANCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSAoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCk7DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FOg0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3cy5nZXRJbXBsZW1lbnRhdGlvbigpKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJcmV0dXJuIEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlGUU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiB3cy5lR2V0KGZlYXR1cmUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eURlZmF1bHRzLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9BYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwMTY4MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL0Fic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLlBhcmFtVmFsdWVDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQmFzZSBjbGFzcyBmb3IgRE9NIGFkYXB0ZXJzIHRoYXQgbGlzdGVuIHRvIGNoYW5nZXMgaW4gRE9NIG9iamVjdHMgYW5kIGFwcGxpZXMgaXQNCi0gKiB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLiBFeHRlbmRlcnMgc2hvdWxkIGltcGxlbWVudCA8Y29kZT5nZXRBbm5vdGF0aW9uKCk8L2NvZGU+DQotICogbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UgdG8gYmUgc2F2ZWQgdG8gamF2YSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElBbm5vdGF0aW9uU2VyaWFsaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYyA9IG5ldyBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvcigpOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIEBwYXJhbSByZXNvdXJjZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cmVzb3VyY2U8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcihmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJlc291cmNlLCAicmVzb3VyY2UiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJaWYgKCFyZXNvdXJjZS5pc1NhdmVFbmFibGVkKCkgfHwgbXNnLmlzVG91Y2goKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaWYgKG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uU0VUICYmIG1zZy5nZXRFdmVudFR5cGUoKSAhPSBOb3RpZmljYXRpb24uVU5TRVQpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlzYXZlKG1zZyk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZWZhdWx0IHZhbHVlIGNoZWNrIC0gd29ya3Mgb25seSBmb3IgU3RyaW5nIHZhbHVlcywgdHJpbXMgdGhlDQotCSAqIG5ldyB2YWx1ZSBjaGVja3MgZm9yIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBpZiBpdCBpcyBub3QgbnVsbCBwdXRzIHRoZQ0KLQkgKiB2YWx1ZSB0byB0aGUgb2JqZWN0IGFuZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4NCi0JICogQHBhcmFtIG1zZw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgdGhlIHZhbHVlIGlzIHZhbGlkDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1ZhbHVlKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpDQotCXsNCi0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpZ2V0VGFyZ2V0KCk7DQotCQlmaW5hbCBTdHJpbmcgbmV3VmFsdWUgPSBnZXROZXdTdHJpbmdWYWx1ZShtc2cpOw0KLQkJaWYgKG5ld1ZhbHVlPT1udWxsKSB7CQkJDQotCQkJcmV0dXJuIHJldmVydFZhbHVlKG9iaiwgbXNnKTsNCi0JCX0NCi0JCQ0KLQkJLy8gdGhpcyBjYWxsIGlzIG5lZWRlZCBjYXVzZSBuZXdWYWx1ZSBtaWdodCBiZSB0cmltbWVkDQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbmV3VmFsdWUpOw0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNhdmUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykNCi0Jew0KLQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBmYWxzZTsNCi0JCXRyeSB7DQotCQkJZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsNCi0JCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJaWYgKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpPT0wICYmICFpc0Fubm90YXRpb25SZXF1aXJlZCgpKSB7DQotCQkJCWdldEFubm90YXRpb25Xcml0ZXIoKS5yZW1vdmUoYW5ub3RhdGlvbik7DQotCQkJfSBlbHNlIHsNCi0JCQkJZ2V0QW5ub3RhdGlvbldyaXRlcigpLnVwZGF0ZShhbm5vdGF0aW9uKTsNCi0JCQl9DQotCQkJcHJvY2Vzc2VkID0gdHJ1ZTsNCi0JCX0gDQotCQljYXRjaCAoQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiBlKSB7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfSANCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlpZighcHJvY2Vzc2VkKSB7DQotCQkJCXJldmVydFZhbHVlKChFT2JqZWN0KWdldFRhcmdldCgpLCBtc2cpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGFic3RyYWN0IElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JICAgIHJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3M9PXR5cGU7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkJew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgRG9tVXRpbCB1dGlsKCkgew0KLQkJcmV0dXJuIHV0aWw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBKYXhXc0RlZmF1bHRzQ2FsY3VsYXRvciBkZWZDYWxjKCkJew0KLQkJcmV0dXJuIGRlZkNhbGM7DQotCX0NCi0JDQotCXByb3RlY3RlZCBBbm5vdGF0aW9uV3JpdGVyIGdldEFubm90YXRpb25Xcml0ZXIoKQ0KLQl7DQotCQlyZXR1cm4gQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJUGFyYW1WYWx1ZVBhaXIgY3JlYXRlUGFyYW1WYWx1ZShTdHJpbmcgcGFyYW0sIFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJZmluYWwgSVZhbHVlIGlWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVBhcmFtVmFsdWVQYWlyIGNyZWF0ZVBhcmFtVmFsdWUoU3RyaW5nIHBhcmFtLCBib29sZWFuIHZhbHVlKQ0KLQl7DQotCQlmaW5hbCBJVmFsdWUgaVZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKHZhbHVlKTsNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHBhcmFtLCBpVmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoZmluYWwgRU9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyB0eXBlRlFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUVPYmplY3Qgd2ViUHJvamVjdCA9IG9iamVjdC5lQ29udGFpbmVyKCk7DQotCQl3aGlsZSghKHdlYlByb2plY3QgaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpICYmIHdlYlByb2plY3QhPW51bGwpIHsNCi0JCQl3ZWJQcm9qZWN0ID0gd2ViUHJvamVjdC5lQ29udGFpbmVyKCk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJQcm9qZWN0PT1udWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSAoKElXZWJTZXJ2aWNlUHJvamVjdCl3ZWJQcm9qZWN0KS5nZXROYW1lKCk7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSByZXNvdXJjZS5qYXZhTW9kZWwoKS5nZXRKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7CQkNCi0JCXJldHVybiBqYXZhUHJvamVjdC5maW5kVHlwZSh0eXBlRlFOYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlYWRzIHRoZSBuZXcgc3RyaW5nIHZhbHVlIGZyb20gPGNvZGU+bXNnPC9jb2RlPi4gDQotCSAqIEBwYXJhbSBtc2cNCi0JICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmFsdWUgaXMgZW1wdHkgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+LCBvdGhlcndpc2UgdGhlIHRyaW1tZWQgc3RyaW5nIHZhbHVlLg0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdTdHJpbmdWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpID09IG51bGwpID8gbnVsbCA6IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpLnRyaW0oKTsNCi0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmIG5ld1ZhbHVlLmxlbmd0aCgpID4gMCkgew0KLQkJCXJldHVybiBuZXdWYWx1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXZlcnRzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgY2hhbmdlZCBmZWF0dXJlIHRvIHRoZSBvbGQgdmFsdWUgYW5kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSByZXZlcnRlZA0KLQkgKiBAcGFyYW0gbXNnIHRoZSBtZXNzYWdlDQotCSAqIEByZXR1cm4gYWx3YXlzIHJldHVybnMgZmFsc2UNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHJldmVydFZhbHVlKGZpbmFsIEVPYmplY3Qgb2JqLCBmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlwdXRWYWx1ZShvYmosIChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSwgbXNnLmdldE9sZFZhbHVlKCkpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUHV0cyB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IHRvIHRoZSBjaGFuZ2VkIGZlYXR1cmUuDQotCSAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byBiZSB1cGRhdGVkDQotCSAqIEBwYXJhbSBtc2cgdGhlIG5vdGlmaWNhdGlvbiBtZXNzYWdlDQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIHRvIGJlIHB1dA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcHV0VmFsdWUoZmluYWwgRU9iamVjdCBvYmosIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBmaW5hbCBPYmplY3QgbmV3VmFsdWUpDQotCXsNCi0JCXRyeSB7DQotCQkJb2JqLmVTZXREZWxpdmVyKGZhbHNlKTsNCi0JCQlvYmouZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCW9iai5lU2V0RGVsaXZlcih0cnVlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFRyZWVTZXQ8SVBhcmFtVmFsdWVQYWlyPiBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpDQotCXsNCi0JCXJldHVybiBuZXcgVHJlZVNldDxJUGFyYW1WYWx1ZVBhaXI+KG5ldyBQYXJhbVZhbHVlQ29tcGFyYXRvcigpKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJTG9nZ2VyIGxvZ2dlcigpDQotCXsNCi0JCXJldHVybiBuZXcgTG9nZ2VyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL01ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg3NWY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gc2VyaWFsaXphdGlvbi4gTGlzdGVucyBmb3IgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYW5kIA0KLSAqIHNlcmlhbGl6ZXMgdGhlIG5ldyBvYmplY3QgY29udGVudCB0byB0aGUgdW5kZXJseWluZyBqYXZhIGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlIHRoZSBET00gcmVzb3VyY2UgDQotCSAqLw0KLQlwdWJsaWMgTWV0aG9kU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0JewkJDQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViTWV0aG9kOw0KLQ0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZClnZXRUYXJnZXQoKTsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upd2ViTWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWkgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHNlaSwgc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOwkJDQotCQlpZiAobWV0aG9kPT1udWxsKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSU1ldGhvZCBmb3IgRE9NIG1ldGhvZCB3YXMgbm90IGZvdW5kIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fQU5OT1RBVElPTiwgbWV0aG9kLCBkZWZpbmVQYXJhbVZhbHVlcyh3ZWJNZXRob2QsIG1ldGhvZCkpOwkNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSU1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycyA9IGNyZWF0ZVBhcmFtVmFsdWVTb3J0ZWRUcmVlU2V0KCk7DQotCQlpZiAod2ViTWV0aG9kLmdldE5hbWUoKSE9bnVsbCAmJiAhd2ViTWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFLCB3ZWJNZXRob2QuZ2V0TmFtZSgpKSk7DQotCQl9DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuaXNFeGNsdWRlZCgpKSB7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKQ0KLQl7DQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpIT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmICghc3VwZXIuY2hlY2tWYWx1ZShtc2cpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkZTdiMWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9QYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuSEVBREVSX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURTsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5QQVJUX05BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLldQX0FOTk9UQVRJT047DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5KZWU1RG9tVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogQ2xhc3MgdGhhdCBzZXJpYWxpemVzIHtAbGluayBJV2ViUGFyYW19IG9iamVjdHMgdG8gV2ViUGFyYW0gYW5ub3RhdGlvbiBpbiB1bmRlcmx5aW5nIGphdmENCi0gKiBjbGFzcy4gQ2hlY2tzIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvbWl0cyB0aGUgZGVmYXVsdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1ldGVyU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQlwcml2YXRlIGZpbmFsIEplZTVEb21VdGlscyBqZWU1VXRpbHMgPSBKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBQYXJhbWV0ZXJTZXJpYWxpemVyQWRhcHRlcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSB7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIA0KLQl7DQotCQlpZiAoIXJlc291cmNlKCkuaXNTYXZlRW5hYmxlZCgpKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKTsNCi0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpPT1Eb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fTkFNRSkgDQotCQl7DQotCQkJdHJ5IHsNCi0JCQkJY2hhbmdlUGFydE5hbWUobXNnKTsNCi0JCQl9IA0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgew0KLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJfQ0KLQkJfQkNCi0JCQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY2hhbmdlUGFydE5hbWUoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJaWYgKGplZTVVdGlscy5pc1BhcnROYW1lVXNlZCh3ZWJQYXJhbSkpIA0KLQkJew0KLQkJCWZpbmFsIElBbm5vdGF0aW9uQWRhcHRlciBhbm5BZGFwdGVyID0gKElBbm5vdGF0aW9uQWRhcHRlciApQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KHdlYlBhcmFtLCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJCWZpbmFsIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGFubiA9IGFubkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihXUEFubm90YXRpb25GZWF0dXJlcy5XUF9BTk5PVEFUSU9OKTsNCi0JCQlpZiAoYW5uIT1udWxsICYmIGFubi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmIChjaGVja1ZhbHVlKG1zZykpIHsNCi0JCQlwdXRWYWx1ZSh3ZWJQYXJhbSwgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19QQVJUX05BTUUsIG1zZy5nZXROZXdWYWx1ZSgpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblJlcXVpcmVkKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uPD8gZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGdldEFubm90YXRpb24oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIA0KLQl7DQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSAoSVdlYlBhcmFtKWdldFRhcmdldCgpOw0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiAod2ViTWV0aG9kPT1udWxsIHx8IHdlYk1ldGhvZC5lQ29udGFpbmVyKCk9PW51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc2VpVHlwZSA9IGZpbmRUeXBlKHdlYk1ldGhvZCwgKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYk1ldGhvZC5lQ29udGFpbmVyKCkpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJZmluYWwgSU1ldGhvZCBtZXRob2QgPSB1dGlsKCkuZmluZE1ldGhvZChzZWlUeXBlLCB3ZWJNZXRob2QpOw0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihXUF9BTk5PVEFUSU9OLCANCi0JCQkJbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSksDQotCQkJCWRlZmluZVBhcmFtVmFsdWVzKHdlYlBhcmFtLCB3ZWJNZXRob2QpKTsJDQotCX0NCi0JDQotCXByb3RlY3RlZCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBkZWZpbmVQYXJhbVZhbHVlcyhmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0sIGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiB2YWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0JCQ0KLQkJaWYgKHdlYlBhcmFtLmdldEtpbmQoKSE9V2ViUGFyYW1LaW5kLklOKSB7DQotCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlTW9kZVZhbHVlUGFpcih3ZWJQYXJhbSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAod2ViUGFyYW0uaXNIZWFkZXIoKSkgew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoSEVBREVSX0FUVFJJQlVURSwgdHJ1ZSkpOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGRlZk5hbWUgPSBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdE5hbWUod2ViUGFyYW0pOw0KLQkJaWYgKGplZTVVdGlscy5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkgfHwgDQotCQkJKCF3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKGRlZk5hbWUpICYmIGplZTVVdGlscy5pc05hbWVVc2VkKHdlYlBhcmFtKSkpIA0KLQkJew0KLQkJCXZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJDQotCQlpZiAoamVlNVV0aWxzLmlzUGFydE5hbWVVc2VkKHdlYlBhcmFtKSAmJiAhd2ViUGFyYW0uZ2V0UGFydE5hbWUoKS5lcXVhbHMoZGVmTmFtZSkpIHsNCi0JCQl2YWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUsIHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKTsNCi0JCX0NCi0NCi0JCWlmICh3ZWJQYXJhbS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCkgDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIGRlZk5zID0gZGVmQ2FsYygpLmNhbGNXZWJQYXJhbURlZmF1bHRUYXJnZXROUyh3ZWJNZXRob2QsIHdlYlBhcmFtKTsNCi0JCQlpZiAod2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkudHJpbSgpLmxlbmd0aCgpICE9IDAgJiYgIXdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhkZWZOcykpIHsNCi0JCQkJdmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgd2ViUGFyYW0uZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiB2YWx1ZVBhaXJzOw0KLQl9CQ0KLQkNCi0JcHJvdGVjdGVkIElQYXJhbVZhbHVlUGFpciBjcmVhdGVNb2RlVmFsdWVQYWlyKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkgDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IG51bGw7DQotCQlzd2l0Y2ggKHdlYlBhcmFtLmdldEtpbmQoKSkgDQotCQl7DQotCQljYXNlIE9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9PVVQpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBJTk9VVDoNCi0JCQl2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5XRUJfUEFSQU1fTU9ERV9JTk9VVCk7DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZShXUEFubm90YXRpb25GZWF0dXJlcy5NT0RFX0FUVFJJQlVURSwgdmFsdWUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNQYXJhbVdpdGhTYW1lTmFtZShmaW5hbCBJV2ViUGFyYW0gcGFyYW0sIGZpbmFsIFN0cmluZyBuZXdOYW1lKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXBhcmFtLmVDb250YWluZXIoKTsNCi0JCWZvciAoSVdlYlBhcmFtIHdlYlBhcmFtIDogd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKSkgDQotCQl7DQotCQkJaWYod2ViUGFyYW09PXBhcmFtKSB7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQkNCi0JCQlpZih3ZWJQYXJhbS5nZXROYW1lKCkuZXF1YWxzKG5ld05hbWUpKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tWYWx1ZShmaW5hbCBOb3RpZmljYXRpb24gbXNnKSANCi0Jew0KLQkJaWYoKChFU3RydWN0dXJhbEZlYXR1cmUpbXNnLmdldEZlYXR1cmUoKSkuZ2V0RmVhdHVyZUlEKCk9PURvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gc3VwZXIuY2hlY2tWYWx1ZShtc2cpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZWlTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEzYmJhNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1NlaVNlcmlhbGl6ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIHRoYXQgb24ge0BsaW5rIElXZWJTZXJ2aWNlfSBvYmplY3QgY2hhbmdlIHNhdmVzIHRoZSBhbm5vdGF0aW9uIHRvIA0KLSAqIHRoZSB1bmRlcmx5aW5nIGNvbXBpbGF0aW9uIHVuaXQuIFVzZXMge0BsaW5rIEpheFdzV29ya3NwYWNlUmVzb3VyY2V9IHRvIGRlZmluZSANCi0gKiBpZiBzYXZlIG9wZXJhdGlvbiBpcyBlbmFibGVkLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpU2VyaWFsaXplckFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNlcmlhbGl6ZXJBZGFwdGVyDQotew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogQHBhcmFtIHJlc291cmNlDQotCSAqLw0KLQlwdWJsaWMgU2VpU2VyaWFsaXplckFkYXB0ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSkgew0KLQkJc3VwZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uUmVxdWlyZWQoKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAJDQotCXsNCi0JCWFzc2VydCBnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotDQotCQlyZXR1cm4gY3JlYXRlSUFubm90YXRpb24oKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBjcmVhdGVJQW5ub3RhdGlvbihmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSUphdmFNb2RlbCBqYXZhTW9kZWwpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHNlaSwgInNlaSIpOy8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGphdmFNb2RlbCwgImphdmFNb2RlbCIpOy8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJew0KLQkJCWlmIChzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5zaXplKCkgPT0gMCkgew0KLQkJCQkvLyB0aGUgaW1wbGljaXQgU0VJIGhhcyBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwcm9qZWN0DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQlyZXR1cm4gbmV3IFdzU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UoKSkuY3JlYXRlSUFubm90YXRpb24oc2VpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkuZ2V0KDApLCBqYXZhTW9kZWwpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoc2VpLCBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZSA9PSBudWxsKSB7DQotCQkJLy8gdGhlIGV4cGxpY2l0IFNFSSBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHJvamVjdA0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzID0gY3JlYXRlUGFyYW1WYWx1ZVNvcnRlZFRyZWVTZXQoKTsNCi0NCi0JCWlmIChzZWkuZ2V0TmFtZSgpIT1udWxsICYmICFzZWkuZ2V0TmFtZSgpLmVxdWFscyhKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0dHlwZU5hbWUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5OQU1FX0FUVFJJQlVURSwgc2VpLmdldE5hbWUoKSkpOw0KLQkJfQ0KLQkJaWYgKHNlaS5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiAhc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpLmVxdWFscyhKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpKSkgew0KLQkJCXBhcmFtVmFsdWVQYWlycy5hZGQoY3JlYXRlUGFyYW1WYWx1ZShXU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSwgc2VpLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7CQ0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc2VyaWFsaXplci9TZXJpYWxpemVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzRmYmIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvU2VyaWFsaXplckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zZXJpYWxpemVyOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklBbm5vdGF0aW9uU2VyaWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkRvbUFkYXB0ZXJGYWN0b3J5Ow0KLS8qKg0KLSAqIEZhY3RvcnkgZm9yIHNlcmlhbGl6YXRpb24gYWRhcHRlcnMuIFRoaXMgZmFjdG9yeSBpcyBpbnN0YW50aWF0ZWQgb24gY29uc3RydWN0aW9uIGJ5IA0KLSAqIHtAbGluayBKYXhXc1dvcmtzcGFjZVJlc291cmNlfSBhbmQgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBzYW1lIGluc3RhbmNlDQotICogaW4gY2FzZSB5b3UgbmVlZCB0aGlzIGZhY3RvcnkuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTZXJpYWxpemVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBEb21BZGFwdGVyRmFjdG9yeQ0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnJlc291cmNlPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljIFNlcmlhbGl6ZXJBZGFwdGVyRmFjdG9yeShmaW5hbCBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocmVzb3VyY2UsICJyZXNvdXJjZSIpOy8vJE5PTi1OTFMtMSQNCi0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NTZXJpYWxpemVyQWRhcHRlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgU2VpU2VyaWFsaXplckFkYXB0ZXIocmVzb3VyY2UpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclNlcmlhbGl6ZXJBZGFwdGVyKHJlc291cmNlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpDQotCXsNCi0JCXJldHVybiBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zZXJpYWxpemVyL1dzU2VyaWFsaXplckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGUxZDVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3NlcmlhbGl6ZXIvV3NTZXJpYWxpemVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnNlcmlhbGl6ZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuSmF4V3NVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgdGhhdCBvbiB7QGxpbmsgSVdlYlNlcnZpY2V9IG9iamVjdCBjaGFuZ2Ugc2F2ZXMgdGhlIGFubm90YXRpb24gdG8gDQotICogdGhlIHVuZGVybHlpbmcgY29tcGlsYXRpb24gdW5pdC4gVXNlcyB7QGxpbmsgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZX0gdG8gZGVmaW5lIA0KLSAqIGlmIHNhdmUgb3BlcmF0aW9uIGlzIGVuYWJsZWQuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc1NlcmlhbGl6ZXJBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTZXJpYWxpemVyQWRhcHRlcg0KLXsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKiBAcGFyYW0gcmVzb3VyY2UNCi0JICovDQotCXB1YmxpYyBXc1NlcmlhbGl6ZXJBZGFwdGVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UpIA0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25SZXF1aXJlZCgpIHsNCi0JCXJldHVybiB0cnVlOw0KLQl9CQkNCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBnZXRBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJYXNzZXJ0IGdldFRhcmdldCgpIGluc3RhbmNlb2YgSVdlYlNlcnZpY2U7DQotCQkNCi0JCXJldHVybiBjcmVhdGVJQW5ub3RhdGlvbigoSVdlYlNlcnZpY2UpZ2V0VGFyZ2V0KCksIHJlc291cmNlKCkuamF2YU1vZGVsKCkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlSUFubm90YXRpb24oZmluYWwgSVdlYlNlcnZpY2Ugd3MsIGZpbmFsIElKYXZhTW9kZWwgamF2YU1vZGVsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW51bGxDaGVja1BhcmFtKHdzLCAid3MiKTsvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShqYXZhTW9kZWwsICJqYXZhTW9kZWwiKTsvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIElUeXBlIHR5cGUgPSBmaW5kVHlwZSh3cywgd3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQlpZiAodHlwZT09bnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMgPSBjcmVhdGVQYXJhbVZhbHVlU29ydGVkVHJlZVNldCgpOw0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IHdzLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJaWYgKHNlaSE9bnVsbCkgDQotCQl7CQkJDQotCQkJaWYgKHNlaS5pc0ltcGxpY2l0KCkpIA0KLQkJCXsNCi0JCQkJU3RyaW5nIHNlaU5hbWUgPSBzZWkuZ2V0TmFtZSgpOw0KLQkJCQlpZiAoIUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShzZWkuZ2V0SW1wbGVtZW50YXRpb24oKSkuZXF1YWxzKHNlaU5hbWUpKSB7DQotCQkJCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldE5hbWUoKSkpOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLkVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGF0aW9uKCkpKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmICh3cy5nZXROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldE5hbWUoKS5lcXVhbHMoSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuU0VSVklDRV9OQU1FX0FUVFJJQlVURSwgd3MuZ2V0TmFtZSgpKSk7DQotCQl9CQkJCQ0KLQkJaWYgKHdzLmdldFBvcnROYW1lKCkhPW51bGwgJiYgDQotCQkJIXdzLmdldFBvcnROYW1lKCkuZXF1YWxzKEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKHdzLmdldEltcGxlbWVudGF0aW9uKCkpKSkgDQotCQl7DQotCQkJcGFyYW1WYWx1ZVBhaXJzLmFkZChjcmVhdGVQYXJhbVZhbHVlKFdTQW5ub3RhdGlvbkZlYXR1cmVzLlBPUlRfTkFNRV9BVFRSSUJVVEUsIHdzLmdldFBvcnROYW1lKCkpKTsNCi0JCX0NCi0JCWlmICh3cy5nZXRUYXJnZXROYW1lc3BhY2UoKSE9bnVsbCAmJiANCi0JCQkhd3MuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpKSANCi0JCXsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEUsIHdzLmdldFRhcmdldE5hbWVzcGFjZSgpKSk7DQotCQl9DQotCQlpZiAod3MuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQlwYXJhbVZhbHVlUGFpcnMuYWRkKGNyZWF0ZVBhcmFtVmFsdWUoV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NETF9MT0NBVElPTl9BVFRSSUJVVEUsIHdzLmdldFdzZGxMb2NhdGlvbigpKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKFdTQW5ub3RhdGlvbkZlYXR1cmVzLldTX0FOTk9UQVRJT04sIHR5cGUsIHBhcmFtVmFsdWVQYWlycyk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9NZXRob2RQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZmE4NTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvTWV0aG9kUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotDQotLyoqDQotICogRGVmaW5lcyB0aGUgc3RhdGUgb2Ygd2ViIG1ldGhvZCBwcm9wZXJ0aWVzLiBJbiBjYXNlIHRoZSBtZXRob2QgaXMgcGFydCBvZg0KLSAqIG91dHNpZGUtaW4gd2ViIHNlcnZpY2UgYWxsIHByb3BlcnRpZXMgYXJlIGltbXV0YWJsZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJUHJvcGVydHlTdGF0ZSANCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgDQotCXsNCi0JCWZpbmFsIElXZWJNZXRob2QgbWV0aG9kID0gKElXZWJNZXRob2QpZ2V0VGFyZ2V0KCk7IA0KLQkJaWYgKGlzT3V0aWRlSW5XcyhtZXRob2QpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlzd2l0Y2goZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSkNCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fTkFNRToNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0JCQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByaXZhdGUgYm9vbGVhbiBpc091dGlkZUluV3MoZmluYWwgSVdlYk1ldGhvZCBtZXRob2QpDQotCXsNCi0JCWZpbmFsIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpbWV0aG9kLmVDb250YWluZXIoKTsNCi0JCWlmIChzZWk9PW51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA6IHNlaS5nZXRJbXBsZW1lbnRpbmdXZWJTZXJ2aWNlcygpKSB7DQotCQkJaWYgKHdlYlNlcnZpY2UuZ2V0V3NkbExvY2F0aW9uKCkhPW51bGwpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7DQotCQlyZXR1cm4gSVByb3BlcnR5U3RhdGUuY2xhc3MgPT0gdHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1BhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIwMmVhNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9QYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdVc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsLkplZTVEb21VdGlsczsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBmb3Ige0BsaW5rIElXZWJQYXJhbX0gYXJlIGVkaXRhYmxlDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQcm9wZXJ0eVN0YXRlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgSVByb3BlcnR5U3RhdGUNCi17DQotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdlYWJsZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgCQ0KLQl7DQotCQlhc3NlcnQgZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBJV2ViUGFyYW07DQotCQkNCi0JCWZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSA9IChJV2ViUGFyYW0pZ2V0VGFyZ2V0KCk7DQotCQlpZiAod2ViUGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoInJldHVybiIpKSB7Ly8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKGlzT3V0c2lkZUluV2ViU2VydmljZSh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSANCi0JCXsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19OQU1FOg0KLQkJCXJldHVybiBpc05hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJcmV0dXJuIGlzUGFydE5hbWVDaGFuZ2VhYmxlKHdlYlBhcmFtKTsJCQkNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiBpc1RhcmdldE5TQ2hhbmdlYWJsZSh3ZWJQYXJhbSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0TmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJDQotCQlyZXR1cm4gKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1N0eWxlKCk9PVNPQVBCaW5kaW5nU3R5bGUuUlBDICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpPT1TT0FQQmluZGluZ1VzZS5MSVRFUkFMICYmDQotCQkJCXdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCk9PVNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzTmFtZUNoYW5nZWFibGUoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKXdlYlBhcmFtLmVDb250YWluZXIoKTsJCQ0KLQkJaWYgKGlzRG9jdW1lbnRMaXRlcmFsV3JhcHBlZCh3ZWJNZXRob2QpKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCWlmIChKZWU1RG9tVXRpbHMuZ2V0SW5zdGFuY2UoKS5pc05hbWVSZXF1aXJlZCh3ZWJQYXJhbSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHdlYlBhcmFtLmlzSGVhZGVyKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFyZ2V0TlNDaGFuZ2VhYmxlKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7CQkNCi0JCWlmIChpc0RvY3VtZW50TGl0ZXJhbFdyYXBwZWQod2ViTWV0aG9kKSkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gd2ViUGFyYW0uaXNIZWFkZXIoKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudExpdGVyYWxXcmFwcGVkKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kKQ0KLQl7DQotCQlyZXR1cm4gISh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdVc2UoKT09U09BUEJpbmRpbmdVc2UuRU5DT0RFRCB8fA0KLQkJCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldlYlNlcnZpY2UoZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXdlYlBhcmFtLmVDb250YWluZXIoKS5lQ29udGFpbmVyKCk7CQkNCi0JCXJldHVybiBEb21VdGlsLklOU1RBTkNFLmlzT3V0c2lkZUluV2ViU2VydmljZShzZWkpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1Byb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NTc4NWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBBZGFwdGVyIGZhY3RvcnkgZm9yIGFkYXB0ZXJzIGltcGxlbWVudGluZyB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGludGVyZmFjZS4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIERvbUFkYXB0ZXJGYWN0b3J5DQotew0KLQkvKioNCi0JICogU2luZ2xldG9uIGluc3RhbmNlIGZvciB0aGlzIGFkYXB0ZXIgZmFjdG9yeSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvcGVydHlTdGF0ZUFkYXB0ZXJGYWN0b3J5IElOU1RBTkNFID0gbmV3IFByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeSgpOw0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IG9iamVjdDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBuZXcgV3NQcm9wZXJ0eVN0YXRlQWRhcHRlcigpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IFNlaVByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0JDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlyZXR1cm4gbmV3IE1ldGhvZFByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCl7DQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlclByb3BlcnR5U3RhdGVBZGFwdGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9TZWlQcm9wZXJ0eVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2YmNjNmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3RhdGUvU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLQ0KLS8qKg0KLSAqIHtAbGluayBJUHJvcGVydHlTdGF0ZX0gYWRhcHRlciBmb3Ige0BsaW5rIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2V9IG9iamVjdHMuDQotICogIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2VpUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKWdldFRhcmdldCgpOw0KLQkJaWYgKGlzT3V0c2lkZUluV3Moc2VpKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCQ0KLQkJc3dpdGNoKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkpDQotCQl7DQotCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQlyZXR1cm4gIXNlaS5pc0ltcGxpY2l0KCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc091dHNpZGVJbldzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpKSANCi0JewkJDQotCQlmb3IgKElXZWJTZXJ2aWNlIHdlYlNlcnZpY2UgOiBzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKSkgew0KLQkJCWlmICh3ZWJTZXJ2aWNlLmdldFdzZGxMb2NhdGlvbigpIT1udWxsKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIElQcm9wZXJ0eVN0YXRlLmNsYXNzID09IHR5cGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zdGF0ZS9Xc1Byb3BlcnR5U3RhdGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzcwM2ViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N0YXRlL1dzUHJvcGVydHlTdGF0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN0YXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi0NCi0vKioNCi0gKiB7QGxpbmsgSVByb3BlcnR5U3RhdGV9IGFkYXB0ZXIgZm9yIHtAbGluayBJV2ViU2VydmljZX0gb2JqZWN0cy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFdzUHJvcGVydHlTdGF0ZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElQcm9wZXJ0eVN0YXRlDQotew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NoYW5nZWFibGUoZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQl7DQotCQlpZiAoIShnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmIChpc091dHNpZGVJbldzKChJV2ViU2VydmljZSlnZXRUYXJnZXQoKSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkNCi0JCXN3aXRjaChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKQ0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fTkFNRTogDQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19QT1JUX05BTUU6DQotCQkJcmV0dXJuIHRydWU7DQotCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19UQVJHRVRfTkFNRVNQQUNFOg0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXByb3RlY3RlZCBib29sZWFuIGlzT3V0c2lkZUluV3MoZmluYWwgSVdlYlNlcnZpY2Ugd3MpIA0KLQl7DQotCQlyZXR1cm4gd3MuZ2V0V3NkbExvY2F0aW9uKCkgIT0gbnVsbDsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsNCi0JCXJldHVybiBJUHJvcGVydHlTdGF0ZS5jbGFzcyA9PSB0eXBlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1ZDNkMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0Fic3RyYWN0TWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5TQkFubm90YXRpb25GZWF0dXJlcy5TQl9BTk5PVEFUSU9OOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV01Bbm5vdGF0aW9uRmVhdHVyZXMuV01fRVhDTFVERURfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX05BTUVfQVRUUklCVVRFOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1N0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nVXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSUFubm90YXRpb25TZXJpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXIgZXh0ZW5kcyBFbGVtZW50U3luY2hyb25pemVySW1wbA0KLXsNCi0JcHJpdmF0ZSBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIgcGFyYW1ldGVyU3luY2hyb25pemVyID0gbmV3IFBhcmFtZXRlclN5bmNocm9uaXplcih0aGlzKTsNCi0JDQotCXByb3RlY3RlZCBpbnRlcmZhY2UgSU1ldGhvZFZpc2l0b3INCi0Jew0KLQkJdm9pZCB2aXNpdChJTWV0aG9kIG1ldGhvZCwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQl9DQotDQotCXB1YmxpYyBBYnN0cmFjdE1ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2aXNpdEV4cG9zYWJsZU1ldGhvZHMoSU1ldGhvZFZpc2l0b3IgdmlzaXRvciwgSVR5cGVIaWVyYXJjaHkgaGllcmFyY2h5LCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0aG9kcyhmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgSVR5cGUgc2VpVHlwZSwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIENvbGxlY3Rpb248SVdlYk1ldGhvZD4gbWVyZ2VkTWV0aG9kcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJNZXRob2Q+KCk7DQotCQlmaW5hbCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSBzZWlUeXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsNCi0JCWZpbmFsIElNZXRob2RWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSU1ldGhvZFZpc2l0b3IoKQ0KLQkJew0KLQkJCXB1YmxpYyB2b2lkIHZpc2l0KElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWZpbmFsIElXZWJNZXRob2Qgd20gPSBvYnRhaW5JbnN0YW5jZShzZWksIG1ldGhvZCk7DQotCQkJCWlmIChtZXJnZWRNZXRob2RzLmNvbnRhaW5zKHdtKSkNCi0JCQkJew0KLQkJCQkJLyoqDQotCQkJCQkgKiBjaGVjayB3aGV0aGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiBzb21lIG9mIHRoZSBjaGlsZCBjbGFzc2VzLiBJZiBzbw0KLQkJCQkJICogc2tpcCBpdCBhbmQgY29udGludWUuIE9ubHkgdGhlIG1ldGhvZCBpbiB0aGUgbGFzdCBjaGlsZCBkZWNsYXJpbmcgdGhpcyBtZXRob2QgbmVlZHMNCi0JCQkJCSAqIHRvIGJlIHByb2Nlc3NlZCBiZWNhdXNlIGVhY2ggY2hpbGQgaXMgb3ZlcnJpZGluZyB0aGUgcHJvcGVydGllcyBmb3IgdGhlIGV2ZXJ5IG92ZXJyaWRlbg0KLQkJCQkJICogbWV0aG9kLg0KLQkJCQkJICovDQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQkJbWVyZ2VNZXRob2Qod20sIG1ldGhvZCwgaW5zcGVjdG9yKTsNCi0JCQkJbWVyZ2VkTWV0aG9kcy5hZGQod20pOw0KLQkJCX0NCi0JCX07DQotCQl2aXNpdEV4cG9zYWJsZU1ldGhvZHModmlzaXRvciwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQkJcmVtb3ZlTGVmdE1ldGhvZHMoc2VpLCBtZXJnZWRNZXRob2RzKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIElXZWJNZXRob2Qgb2J0YWluSW5zdGFuY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYk1ldGhvZCB3bSA6IHNlaS5nZXRXZWJNZXRob2RzKCkpDQotCQl7DQotCQkJaWYgKHV0aWwoKS5jYWxjSW1wbGVtZW50YXRpb24obWV0aG9kKS5lcXVhbHMod20uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gd207DQotCQkJfQ0KLQkJfQ0KLQkJZmluYWwgSVdlYk1ldGhvZCBuZXdXZWJNZXRob2QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYk1ldGhvZCgpOw0KLQkJc2VpLmdldFdlYk1ldGhvZHMoKS5hZGQobmV3V2ViTWV0aG9kKTsNCi0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUobmV3V2ViTWV0aG9kLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19JTVBMRU1FTlRBVElPTiwgdXRpbCgpLmNhbGNJbXBsZW1lbnRhdGlvbihtZXRob2QpKTsNCi0JCXJldHVybiBuZXdXZWJNZXRob2Q7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlTWV0aG9kKElXZWJNZXRob2Qgd20sIElNZXRob2QgbSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHdtQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG0sIFdNX0FOTk9UQVRJT04pOw0KLQkJZmluYWwgYm9vbGVhbiBleGNsdWRlZDsNCi0JCWZpbmFsIFN0cmluZyBuYW1lOw0KLQkJaWYgKHdtQW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gZmFsc2U7DQotCQkJbmFtZSA9IG0uZ2V0RWxlbWVudE5hbWUoKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWV4Y2x1ZGVkID0gd21Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoV01fRVhDTFVERURfQVRUUklCVVRFKSA9PSBudWxsID8gZmFsc2UgOiBCb29sZWFuLnBhcnNlQm9vbGVhbih3bUFubm90YXRpb24NCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCW5hbWUgPSB3bUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXTV9OQU1FX0FUVFJJQlVURSkgPT0gbnVsbCA/IG0uZ2V0RWxlbWVudE5hbWUoKSA6IHdtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdNX05BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCWlmICghbmFtZS5lcXVhbHMod20uZ2V0TmFtZSgpKSkNCi0JCXsNCi0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHdtLCBEb21QYWNrYWdlLklXRUJfTUVUSE9EX19OQU1FLCBuYW1lKTsNCi0JCX0NCi0JCWlmIChleGNsdWRlZCAhPSB3bS5pc0V4Y2x1ZGVkKCkpDQotCQl7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3bSwgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fRVhDTFVERUQsIGV4Y2x1ZGVkKTsNCi0JCX0NCi0JCW1lcmdlU29hcEJpbmRpbmcod20sIG0sIGluc3BlY3Rvcik7DQotCQlwYXJhbWV0ZXJTeW5jaHJvbml6ZXIuc3luY2hyb25pemVQYXJhbWV0ZXJzKHdtLCBtLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod20sIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7DQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod20sIFdNX0FOTk9UQVRJT04sIHdtQW5ub3RhdGlvbik7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBtZXJnZVNvYXBCaW5kaW5nKGZpbmFsIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IHNiQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgU0JfQU5OT1RBVElPTik7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2VpU2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmaW5lU0JTdHlsZShzYkFubm90YXRpb24sIHNlaVNiQW5ub3RhdGlvbik7DQotCQlpZiAod2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKSAhPSBzdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1N0eWxlKHN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdVc2UgdXNlID0gZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1VzZSgpICE9IHVzZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1VzZSh1c2UpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlIHBhcmFtU3R5bGUgPWRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uLCBzZWlTYkFubm90YXRpb24pOw0KLQkJaWYgKHdlYk1ldGhvZC5nZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKCkgIT0gcGFyYW1TdHlsZSkgew0KLQkJCXdlYk1ldGhvZC5zZXRTb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlKHBhcmFtU3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uod2ViTWV0aG9kLCBTQl9BTk5PVEFUSU9OLCBzYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nU3R5bGUgZGVmaW5lU0JTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNUWUxFX0FUVFJJQlVURSkgOiBudWxsOw0KLQkJaWYodmFsdWU9PW51bGwpIHsNCi0JCQlyZXR1cm4gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2VpU2JBbm5vdGF0aW9uKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1NUWUxFX1JQQy5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5SUEM7DQotCQl9IA0KLQkJDQotCQlpZihTQkFubm90YXRpb25GZWF0dXJlcy5TQl9TVFlMRV9ET0NVTUVOVC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVDsNCi0JCX0NCi0JCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nVXNlIGRlZmluZVNCVXNlKGZpbmFsIElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZFNCQW5ub3RhdGlvbiwgZmluYWwgSUFubm90YXRpb248SVR5cGU+IHNlaVNiQW5ub3RhdGlvbikgDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlVTRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgewkJDQotCQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfVVNFX0VOQ09ERUQuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nVXNlLkVOQ09ERUQ7DQotCQl9DQotCQkNCi0JCWlmIChTQkFubm90YXRpb25GZWF0dXJlcy5TQl9VU0VfTElURVJBTC5lbmRzV2l0aCh2YWx1ZSkpIHsNCi0JCQlyZXR1cm4gU09BUEJpbmRpbmdVc2UuTElURVJBTDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlVzZShzZWlTYkFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUgZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShmaW5hbCBJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RTQkFubm90YXRpb24sIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlTYkFubm90YXRpb24pDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YWx1ZSA9IG1ldGhvZFNCQW5ub3RhdGlvbiE9bnVsbCA/IG1ldGhvZFNCQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlBBUkFNRVRFUl9TVFlMRV9BVFRSSUJVVEUpIDogbnVsbDsNCi0JCWlmICh2YWx1ZT09bnVsbCkgew0KLQkJCXJldHVybiBkZWZDYWxjKCkuZGVmaW5lU0JQYXJhbWV0ZXJTdHlsZShzZWlTYkFubm90YXRpb24pOw0KLQkJfQ0KLQkJDQotCQlpZiAoU0JBbm5vdGF0aW9uRmVhdHVyZXMuU0JfUEFSQU1FVEVSX1NUWUxFX0JBUkUuZW5kc1dpdGgodmFsdWUpKSB7DQotCQkJcmV0dXJuIFNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGUuQkFSRTsNCi0JCX0NCi0JCQ0KLQkJaWYgKFNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX1BBUkFNRVRFUl9TVFlMRV9XUkFQUEVELmVuZHNXaXRoKHZhbHVlKSkgew0KLQkJCXJldHVybiBTT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLldSQVBQRUQ7DQotCQl9CQkNCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5kZWZpbmVTQlBhcmFtZXRlclN0eWxlKHNlaVNiQW5ub3RhdGlvbik7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxlZnRNZXRob2RzKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpLCBDb2xsZWN0aW9uPElXZWJNZXRob2Q+IG1lcmdlZE1ldGhvZHMpDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJNZXRob2Q+IGl0ZXIgPSBzZWkuZ2V0V2ViTWV0aG9kcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJaWYgKCFtZXJnZWRNZXRob2RzLmNvbnRhaW5zKGl0ZXIubmV4dCgpKSkNCi0JCQl7DQotCQkJCWl0ZXIucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvQWJzdHJhY3RNb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhYzIzMzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9BYnN0cmFjdE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5XU19BTk5PVEFUSU9OOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRIYW5kbGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlLlNlcnZpY2VNb2RlbERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBTZWlTeW5jaHJvbml6ZXIgc2VpTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIFdzU3luY2hyb25pemVyIHdzTG9hZGVyOw0KLQ0KLQlwcml2YXRlIGZpbmFsIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2U7DQotDQotCXByaXZhdGUgSURPTSBkb21CZWluZ0xvYWRlZDsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhOw0KLQ0KLQlwcml2YXRlIGZpbmFsIERvbVV0aWwgdXRpbDsNCi0NCi0JcHVibGljIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIoSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSwgU2VydmljZU1vZGVsRGF0YSBzZXJ2aWNlRGF0YSkNCi0Jew0KLQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOw0KLQkJdGhpcy51dGlsID0gbmV3IERvbVV0aWwoKTsNCi0JCXRoaXMuc2VydmljZURhdGEgPSBzZXJ2aWNlRGF0YTsNCi0JCXRoaXMuc2VpTG9hZGVyID0gbmV3IFNlaVN5bmNocm9uaXplcih0aGlzKTsNCi0JCXRoaXMud3NMb2FkZXIgPSBuZXcgV3NTeW5jaHJvbml6ZXIodGhpcyk7DQotCX0NCi0NCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBEb21GYWN0b3J5LmVJTlNUQU5DRTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCWlmIChkb21CZWluZ0xvYWRlZCA9PSBudWxsKQ0KLQkJew0KLQkJCWRvbUJlaW5nTG9hZGVkID0gZG9tRmFjdG9yeSgpLmNyZWF0ZUlET00oKTsNCi0JCX0NCi0JCXJldHVybiBkb21CZWluZ0xvYWRlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcmVzb3VyY2UuamF2YU1vZGVsKCk7DQotCX0NCi0NCi0JcHVibGljIElMb2dnZXIgbG9nZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlLmxvZ2dlcigpOw0KLQl9DQotDQotCXB1YmxpYyBKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlOw0KLQl9DQotDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHNlcnZpY2VEYXRhOw0KLQl9DQotDQotCXB1YmxpYyBEb21VdGlsIHV0aWwoKQ0KLQl7DQotCQlyZXR1cm4gdXRpbDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29tcGlsYXRpb25Vbml0KGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlyZXNvdXJjZS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJaWYgKGN1LmZpbmRQcmltYXJ5VHlwZSgpID09IG51bGwgfHwgIShjdS5maW5kUHJpbWFyeVR5cGUoKS5pc0ludGVyZmFjZSgpIHx8IGN1LmZpbmRQcmltYXJ5VHlwZSgpLmlzQ2xhc3MoKSkpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gcHJpbWFyeSB0eXBlIGluIGNvbXBpbGF0aW9uIHVuaXQiICsgY3UuZ2V0UGF0aCgpLnRvT1NTdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXJldHVybjsNCi0JCQl9IA0KLQkJCQkJCQ0KLQkJCWZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvciA9IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3RvcihjdS5maW5kUHJpbWFyeVR5cGUoKSk7DQotCQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiA9IGluc3BlY3Rvci5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCQlpZiAod3NBbm5vdGF0aW9uID09IG51bGwpDQotCQkJew0KLQkJCQlpZiAobG9nZ2VyKCkuaXNEZWJ1ZygpKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1Zygibm8gIiArIFdTX0FOTk9UQVRJT04gKyAiIGFubm90YXRpb24gZm91bmQgb24gdHlwZSAiICsgY3UuZmluZFByaW1hcnlUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkDQotCQkJCX0NCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlyZWNvcmRIaWVyYXJjaHkoY3UuZmluZFByaW1hcnlUeXBlKCkpOw0KLQkJCQ0KLQkJCWlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0ludGVyZmFjZSgpKQ0KLQkJCXsNCi0JCQkJLy8gaGFuZGxlIGNsYXNzIGNoYW5nZWQgdG8gaW50ZXJmYWNlDQotCQkJCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSk7DQotCQkJCQ0KLQkJCQlzZWlMb2FkZXIuc3luY2hyb25pemVJbnRlcmZhY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7DQotCQkJfSBlbHNlIGlmICh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5pc0NsYXNzKCkpDQotCQkJew0KLQkJCQkvLyBoYW5kbGUgaW50ZXJmYWNlIGNoYW5nZWQgdG8gY2xhc3MNCi0JCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBmYWxzZSwgdHJ1ZSk7DQotCQkJCQ0KLQkJCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgY2hhbmdlZCBhbmQgZW5kcG9pbnRJbnRlcmZhY2UgaGFzIGJlZW4gYWRkZWQgdGhlIGV4aXN0aW5nDQotCQkJCS8vIFNFSSBpbiB0aGUgcHJvamVjdCBzaG91bGQgYmUgcmVtb3ZlZA0KLQkJCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IHdzTG9hZGVyLnN5bmNocm9uaXplV2ViU2VydmljZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCQkJaWYgKHdzIT1udWxsICYmICh3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKT09bnVsbCB8fCAhd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKSkgew0KLQkJCQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1Byb2plY3QsIHdzLmdldEltcGxlbWVudGF0aW9uKCksIGZhbHNlLCBmYWxzZSk7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJCXsNCi0JCQkJCWxvZ2dlcigpLmxvZ0RlYnVnKCJhbm5vdGF0aW9uICIgKyBXU19BTk5PVEFUSU9OICsgIiBpcyBwdXQgb24gdHlwZSAiLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQNCi0JCQkJCQkJCQkrIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpDQotCQkJCQkJCQkJKyAid2hpY2ggaXMgbmVpdGhlciBpbnRlcmZhY2UsIG5vciBhIGNsYXNzLiBJZ25vcnJpbmchIik7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQkJCQ0KLQkJfSBmaW5hbGx5IHsNCi0JCQlyZXNvdXJjZS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgd2ViIHNlcnZpY2VzIGZyb20gdGhlIG1vZGVsLg0KLQkgKiBAcGFyYW0gd3NQcm9qZWN0DQotCSAqIEBwYXJhbSBpbXBsQmFzZU5hbWUNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVdzTW9kZWxFbGVtZW50cyhmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBmaW5hbCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBmaW5hbCBib29sZWFuIGlzRm9yUGFja2FnZSkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElXZWJTZXJ2aWNlPiB3c0l0ZXIgPSB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKS5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKHdzSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2Ugd3MgPSB3c0l0ZXIubmV4dCgpOw0KLQkJCWlmICh3cy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsQmFzZU5hbWUpIHx8IA0KLQkJCQkoaXNGb3JQYWNrYWdlICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuc3RhcnRzV2l0aChpbXBsQmFzZU5hbWUpKSkNCi0JCQl7DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSk7DQotCQkJCXdzSXRlci5yZW1vdmUoKTsNCi0JCQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwpDQotCQkJCXsNCi0JCQkJCXdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmdldEltcGxlbWVudGluZ1dlYlNlcnZpY2VzKCkucmVtb3ZlKHdzKTsNCi0JCQkJfQ0KLQkJCQlzZXJ2aWNlRGF0YSgpLnVubWFwKHdzKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIFNFSSdzIHdpdGggPGNvZGU+aW1wbEJhc2VOYW1lPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZSBtb2RlbC4NCi0JICogQHBhcmFtIHdzUHJvamVjdA0KLQkgKiBAcGFyYW0gaW1wbEJhc2VOYW1lDQotCSAqIEBwYXJhbSBvbmx5RXhwbGljaXQgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gaW1wbGljaXQgaW50ZXJmYWNlcyBhcmUgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCwgb3RoZXJ3aXNlIGJvdGggYXJlIHJlbW92ZWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZWlNb2RlbEVsZW1lbnRzKGZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIGZpbmFsIFN0cmluZyBpbXBsQmFzZU5hbWUsIGZpbmFsIGJvb2xlYW4gaXNGb3JQYWNrYWdlLCBmaW5hbCBib29sZWFuIG9ubHlFeHBsaWNpdCkgDQotCXsNCi0JCWZpbmFsIEl0ZXJhdG9yPElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U+IHNlaUl0ZXIgPSB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoc2VpSXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBzZWlJdGVyLm5leHQoKTsNCi0JCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxCYXNlTmFtZSkgfHwNCi0JCQkJKGlzRm9yUGFja2FnZSAmJiBzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5zdGFydHNXaXRoKGltcGxCYXNlTmFtZSkpKQ0KLQkJCXsNCi0JCQkJaWYgKChvbmx5RXhwbGljaXQgJiYgc2VpLmlzSW1wbGljaXQoKSkpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCXNlcnZpY2VEYXRhKCkuY2xlYXJIaWVyYXJjaHkoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJCQlzZWlJdGVyLnJlbW92ZSgpOw0KLQkJCX0NCi0JCX0NCi0JfQkNCi0NCi0Jdm9pZCByZWNvcmRIaWVyYXJjaHkoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBDb2xsZWN0aW9uPElDb21waWxhdGlvblVuaXQ+IGNvbXBpbGF0aW9uVW5pdHMgPSBuZXcgTGlua2VkTGlzdDxJQ29tcGlsYXRpb25Vbml0PigpOw0KLQkJDQotCQlmb3IgKElUeXBlIHN1cGVyVHlwZSA6IHR5cGUubmV3U3VwZXJ0eXBlSGllcmFyY2h5KG51bGwpLmdldEFsbFN1cGVydHlwZXModHlwZSkpIHsNCi0JCQljb21waWxhdGlvblVuaXRzLmFkZChzdXBlclR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOw0KLQkJfQ0KLQkJCQ0KLQkJc2VydmljZURhdGEoKS5yZWNvcmRIaWVyYXJjaHkodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgY29tcGlsYXRpb25Vbml0cyk7DQotCX0NCi0NCi0NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBjcmVhdGVQcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3QgdGhpc1Byb2plY3QgPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRoaXNQcm9qZWN0LCBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUX19OQU1FLCBqcHJqLmdldEVsZW1lbnROYW1lKCkpOw0KLQ0KLQkJdXRpbCgpLmFkZFRvQ29sbGVjdGlvbkZlYXR1cmUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUywgdGhpc1Byb2plY3QpOw0KLQkJcmV0dXJuIHRoaXNQcm9qZWN0Ow0KLQl9DQotDQotCXByb3RlY3RlZCBjbGFzcyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyIGltcGxlbWVudHMgSUNvbXBpbGF0aW9uVW5pdEhhbmRsZXINCi0Jew0KLQkJcHVibGljIHZvaWQgc3RhcnRlZCgpDQotCQl7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmaW5pc2hlZCgpDQotCQl7DQotCQkJcmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChnZXREb21CZWluZ0xvYWRlZCgpKTsNCi0JCX0NCi0NCi0JCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0Ow0KLQ0KLQkJcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElKYXZhUHJvamVjdCBqcHJqKQ0KLQkJew0KLQkJCXdzUHJvamVjdCA9IGNyZWF0ZVByb2plY3QoanByaik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkNCi0JCQl7DQotCQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gcGFyc2UgdGhlIGNvbnRlbnQgb2YgY29tcGlsYXRpb24gdW5pdCIgKyBjdS5nZXRQYXRoKCkudG9PU1N0cmluZygpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9FbGVtZW50U3luY2hyb25pemVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmODE5NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL0VsZW1lbnRTeW5jaHJvbml6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLklBbm5vdGF0aW9uQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLQ0KLWNsYXNzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsIGltcGxlbWVudHMgSU1vZGVsRWxlbWVudFN5bmNocm9uaXplcg0KLXsNCi0NCi0JcHJpdmF0ZSBmaW5hbCBJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudDsNCi0JcHJpdmF0ZSBmaW5hbCBEb21VdGlsIHV0aWw7DQotCXByaXZhdGUgZmluYWwgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmYXVsdHNDYWxjdWxhdG9yOw0KLQkNCi0JRWxlbWVudFN5bmNocm9uaXplckltcGwoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXRoaXMucGFyZW50ID0gcGFyZW50Ow0KLQkJdXRpbCA9IG5ldyBEb21VdGlsKCk7DQotCQlkZWZhdWx0c0NhbGN1bGF0b3IgPSBuZXcgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbVV0aWwgdXRpbCgpIHsNCi0JCXJldHVybiB1dGlsOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NEZWZhdWx0c0NhbGN1bGF0b3IgZGVmQ2FsYygpIHsNCi0JCXJldHVybiBkZWZhdWx0c0NhbGN1bGF0b3I7DQotCX0NCi0JDQotCXB1YmxpYyBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmVudC5zZXJ2aWNlRGF0YSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmxvZ2dlcigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSURPTSBnZXREb21CZWluZ0xvYWRlZCgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZ2V0RG9tQmVpbmdMb2FkZWQoKTsNCi0JfQ0KLQkNCi0JcHVibGljIERvbUZhY3RvcnkgZG9tRmFjdG9yeSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQuZG9tRmFjdG9yeSgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUphdmFNb2RlbCBqYXZhTW9kZWwoKQ0KLQl7DQotCQlyZXR1cm4gcGFyZW50LmphdmFNb2RlbCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSByZXNvdXJjZSgpDQotCXsNCi0JCXJldHVybiBwYXJlbnQucmVzb3VyY2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKGZpbmFsIEVPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKQ0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbkFkYXB0ZXIgbG9jYXRvciA9IChJQW5ub3RhdGlvbkFkYXB0ZXIpQW5ub3RhdGlvbkFkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSUFubm90YXRpb25BZGFwdGVyLmNsYXNzKTsNCi0JCWxvY2F0b3IuYWRkQW5ub3RhdGlvbihhbm5GUU5hbWUsIGFubm90YXRpb24pOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Jbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGJiMDFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvSW5pdGlhbE1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLQ0KLXB1YmxpYyBjbGFzcyBJbml0aWFsTW9kZWxTeW5jaHJvbml6ZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsU3luY2hyb25pemVyDQotew0KLQlwdWJsaWMgSW5pdGlhbE1vZGVsU3luY2hyb25pemVyKEpheFdzV29ya3NwYWNlUmVzb3VyY2UgcmVzb3VyY2UsIFNlcnZpY2VNb2RlbERhdGEgc2VydmljZURhdGEpDQotCXsNCi0JCXN1cGVyKHJlc291cmNlLCBzZXJ2aWNlRGF0YSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9hZChNYXA8Pyw/PiBvcHRpb25zLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbg0KLQl7DQotCQl0cnkgew0KLQkJCXJlc291cmNlKCkuZGlzYWJsZVNhdmluZygpOwkJCQ0KLQkJCXJlc291cmNlKCkubmV3Q29tcGlsYXRpb25Vbml0RmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIHJlc291cmNlKCkuZ2V0UHJvamVjdFNlbGVjdG9ycygpKS4NCi0JCQkJZmluZChtb25pdG9yLCBuZXcgTG9hZGVyQ29tcGlsYXRpb25Vbml0SGFuZGxlcigpKTsNCi0JCX0gZmluYWxseSB7DQotCQkJcmVzb3VyY2UoKS5lbmFibGVTYXZpbmcoKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvT25FdmVudE1vZGVsU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyZWNlMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL09uRXZlbnRNb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLnN5bmM7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklDb21waWxhdGlvblVuaXRGaW5kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JUHJvamVjdFNlbGVjdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldvcmtzcGFjZUNVRmluZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZS5TZXJ2aWNlTW9kZWxEYXRhOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotcHVibGljIGNsYXNzIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplciBleHRlbmRzIEFic3RyYWN0TW9kZWxTeW5jaHJvbml6ZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcg0KLXsNCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBJRE9NIGdldERvbUJlaW5nTG9hZGVkKCkNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlKCkuZ2V0RE9NKCk7DQotCX0NCi0NCi0JcHVibGljIE9uRXZlbnRNb2RlbFN5bmNocm9uaXplcihKYXhXc1dvcmtzcGFjZVJlc291cmNlIHJlc291cmNlLCBTZXJ2aWNlTW9kZWxEYXRhIHNlcnZpY2VEYXRhKQ0KLQl7DQotCQlzdXBlcihyZXNvdXJjZSwgc2VydmljZURhdGEpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmIChsb2dnZXIoKS5pc0RlYnVnKCkpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZygiRWxlbWVudENoYW5nZWRFdmVudCBoYXMgYmVlbiBkZWxpdmVyZWQuIEV2ZW50IGRldGFpbHM6ICIgKyBldmVudC50b1N0cmluZygpKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCQ0KLQkJCS8vIG5vIHByb2Nlc3NpbmcgaWYgRE9NIGxvYWQgaGFzIGJlZW4gY2FuY2VsZWQNCi0JCQlpZiAocmVzb3VyY2UoKS5pc0xvYWRDbmFjZWxlZCgpKSB7DQotCQkJCXJldHVybjsNCi0JCQl9DQotCQkJDQotCQkJcmVzb3VyY2UoKS5kaXNhYmxlU2F2aW5nKCk7DQotCQkJDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfUkVDT05DSUxFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgZWRpdG9yIHNlbmRzIHJlY29uY2lsZSBldmVudA0KLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSkNCi0JCQl7DQotCQkJCWhhbmRsZVJlY29uY2lsZUV2ZW50KGV2ZW50KTsNCi0JCQl9DQotDQotCQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIC0gdGhlIGNhc2Ugd2hlbiB0aGUgY29tcGlsYXRpb24gdW5pdCBoYXMgYmVlbiBjaGFuZ2VkDQotCQkJaWYgKGV2ZW50LmdldERlbHRhKCkuZ2V0RWxlbWVudCgpICE9IHJlc291cmNlKCkuamF2YU1vZGVsKCkpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCQ0KLQkJCWFzc2VydCAoZXZlbnQuZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgKElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4gfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpKSAhPSAwOw0KLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCQl7DQotCQkJCWlmIChjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRQcm9qZWN0KGNoaWxkKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gDQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgew0KLQkJCWxvZ2dlcigpLmxvZ0Vycm9yKCJVbmFibGUgdG8gc3luY2hyb25pemUgV2ViIFNlcnZpY2UgbW9kZWwgdXBvbiBqYXZhIGVsZW1lbnQgZGVsdGEgIisgZXZlbnQuZ2V0RGVsdGEoKSwgY2UpOyAvLyROT04tTkxTLTEkDQotCQl9IA0KLQkJY2F0Y2ggKFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHN5bmNocm9uaXplIFdlYiBTZXJ2aWNlIG1vZGVsIHVwb24gamF2YSBlbGVtZW50IGRlbHRhICIgKyBldmVudC5nZXREZWx0YSgpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSANCi0JCWZpbmFsbHkgew0KLQkJCXJlc291cmNlKCkuZW5hYmxlU2F2aW5nKCk7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsZUV2ZW50KGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYoIShldmVudC5nZXREZWx0YSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQgKSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJaW50IHJlcXVpcmVkRmxhZ3MgPSBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQgfCBJSmF2YUVsZW1lbnREZWx0YS5GX0NISUxEUkVOOw0KLQkJDQotCQlpZiAoKGV2ZW50LmdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIHJlcXVpcmVkRmxhZ3MpID09IDApIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpZXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCk7DQotCQlpZiAoIXJlc291cmNlKCkuYXBwcm92ZVByb2plY3QoY3UuZ2V0SmF2YVByb2plY3QoKSkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlpZiAoaXNKYXZhUmVzb3VyY2UoY3UpKSB7DQotCQkJaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoY3UpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXZhUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gY3U7DQotCQl3aGlsZSAoKGphdmFFbGVtZW50ID0gamF2YUVsZW1lbnQuZ2V0UGFyZW50KCkpICE9IG51bGwpIA0KLQkJew0KLQkJCWlmICghamF2YUVsZW1lbnQuZXhpc3RzKCkpIHsNCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JDQotCXZvaWQgaGFuZGxlQ2hhbmdlZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IChwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KTsNCi0JDQotCQlpZiAoKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKQ0KLQkJCSYmIG51bGwgIT0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQl7DQotCQkJLy9pZiB0aGUgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQgdGhlbiBpdCdzIGZhY2V0J3MgY291bGQgbm90IGJlIHJlYWQuIFRodXMgdGhlIGFwcHJvdmUgbWV0aG9kDQotCQkJLy93aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UuIFRoYXQncyB3aHkgd2UgY2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGFscmVhZHkgYmVlbiBpbiB0aGUgDQotCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJfQ0KLQkJaWYgKCFyZXNvdXJjZSgpLmFwcHJvdmVQcm9qZWN0KChJSmF2YVByb2plY3QpcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKSkpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkgfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkNCi0JCXsNCi0JCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQl9DQotCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcHJvamVjdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoIShjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSkNCi0JCQl7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0JCQlpZiAoKGNoaWxkRGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRU1PVkVEX0ZST01fQ0xBU1NQQVRIKSAhPSAwKQ0KLQkJCXsNCi0JCQkJaGFuZGxlQ2xvc2VkUHJvamVjdChwcm9qZWN0RGVsdGEpOw0KLQkJCQloYW5kbGVPcGVuZWRQcm9qZWN0KHByb2plY3REZWx0YSk7DQotCQkJfQ0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMCkNCi0JCQl7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlUmVtb3ZlZFBhY2thZ2VzKGNoaWxkRGVsdGEpOw0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCXJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhjaGlsZERlbHRhKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQWRkZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcm9vdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkNCi0JCXsNCi0JCQlpZiAoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50ICYmIGNoaWxkRGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKQ0KLQkJCXsNCi0JCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogKChJUGFja2FnZUZyYWdtZW50KWNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpKS5nZXRDb21waWxhdGlvblVuaXRzKCkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGN1KTsNCi0JCQkJfQ0KLQkJCQlyZWN1cnNldmlseUhhbmRsZUFkZGVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3QgZmluZFByb2plY3RCeURlbHRhKElKYXZhRWxlbWVudERlbHRhIHJvb3REZWx0YSkgew0KLQkJcmV0dXJuIHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByb290RGVsdGEuZ2V0RWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZWN1cnNldmlseUhhbmRsZVJlbW92ZWRQYWNrYWdlcyhJSmF2YUVsZW1lbnREZWx0YSByb290RGVsdGEpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJDQotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgOiByb290RGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJew0KLQkJCWlmIChjaGlsZERlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpDQotCQkJew0KLQkJCQlpZiAoY2hpbGREZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkNCi0JCQkJew0KLQkJCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqID0gZmluZFByb2plY3RCeURlbHRhKHJvb3REZWx0YSk7DQotCQkJCQlpZiAod3NQcmogIT0gbnVsbCkgew0KLQkJCQkJCXJlbW92ZU1vZGVsRWxlbWVudHMod3NQcmosIGNoaWxkRGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIHRydWUpOw0KLQkJCQkJfQ0KLQkJCQl9IGVsc2UNCi0JCQkJew0KLQkJCQkJcmVjdXJzZXZpbHlIYW5kbGVSZW1vdmVkUGFja2FnZXMoY2hpbGREZWx0YSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU9wZW5lZFByb2plY3QoSUphdmFFbGVtZW50RGVsdGEgcHJvamVjdERlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJSmF2YVByb2plY3QgY2hhbmdlZFByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpOw0KLQkJbmV3UHJvamVjdENVRmluZGVyKGNoYW5nZWRQcm9qZWN0KS5maW5kKG51bGwsIG5ldyBMb2FkZXJDb21waWxhdGlvblVuaXRIYW5kbGVyKCkpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbG9zZWRQcm9qZWN0KElKYXZhRWxlbWVudERlbHRhIHByb2plY3REZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IHByb2plY3REZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3Q7DQotCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcmogPSB1dGlsKCkuZmluZFByb2plY3RCeU5hbWUoZ2V0RG9tQmVpbmdMb2FkZWQoKSwgcHJvamVjdERlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWlmICh3c1Byaj09bnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCQ0KLQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCXsNCi0JCQlzZWkuZ2V0SW1wbGVtZW50aW5nV2ViU2VydmljZXMoKS5jbGVhcigpOw0KLQkJfQ0KLQkJZm9yIChJV2ViU2VydmljZSB3cyA6IHdzUHJqLmdldFdlYlNlcnZpY2VzKCkpDQotCQl7DQotCQkJc2VydmljZURhdGEoKS51bm1hcCh3cyk7DQotCQl9DQotCQlnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpLnJlbW92ZSh3c1Byaik7DQotCX0NCi0NCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0RmluZGVyIG5ld1Byb2plY3RDVUZpbmRlcihmaW5hbCBJSmF2YVByb2plY3QgcHJqKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFdvcmtzcGFjZUNVRmluZGVyKHJlc291cmNlKCkuamF2YU1vZGVsKCksIG5ldyBJUHJvamVjdFNlbGVjdG9yW10geyBuZXcgSVByb2plY3RTZWxlY3RvcigpDQotCQl7DQotCQkJcHVibGljIGJvb2xlYW4gYXBwcm92ZShJSmF2YVByb2plY3QgdG9BcHByb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHByai5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyh0b0FwcHJvdmUuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJfQ0KLQkJfSB9KTsNCi0JfQ0KLQ0KLQkvLyBoYW5kbGVzIGNvbXBpbGF0aW9uIHVuaXRzIC0gc2tpcHMgd29ya2luZyBjb3BpZXMNCi0JcHJpdmF0ZSB2b2lkIHJlY3Vyc2V2aWx5SGFuZGxlQ29tcGlsYXRpb25Vbml0cyhJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkNCi0Jew0KLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpDQotCQl7DQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7DQotCQkJaWYgKHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpPT1udWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQl0cnkNCi0JCQl7DQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX0ZST00pID09IDApDQotCQkJCXsNCi0JCQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSA9PSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVSZW1vdmVkQ29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgJiYgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX01PVkVEX1RPKSAhPSAwKQ0KLQkJCQl7DQotCQkJCQloYW5kbGVNb3ZlZFRvQ29tcGlsYXRpb25Vbml0KGN1LCAoSUNvbXBpbGF0aW9uVW5pdCkgZGVsdGEuZ2V0TW92ZWRUb0VsZW1lbnQoKSk7DQotCQkJCX0NCi0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmIA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB8fA0KLQkJCQkJKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkgIT0gMCkpDQotCQkJCXsNCi0JCQkJCWhhbmRsZUNoYW5nZWRDb250ZW50Q29tcGlsYXRpb25Vbml0KGN1KTsNCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpDQotCQkJew0KLQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiVW5hYmxlIHRvIHBhcnNlIHRoZSBjb250ZW50IG9mIGNvbXBpbGF0aW9uIHVuaXQiICsgZGVsdGEuZ2V0RWxlbWVudCgpLCBqbWUpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfSBlbHNlDQotCQl7DQotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKQ0KLQkJCXsNCi0JCQkJcmVjdXJzZXZpbHlIYW5kbGVDb21waWxhdGlvblVuaXRzKGNoaWxkRGVsdGEpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hhbmdlZENvbnRlbnRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJVHlwZSB0eXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7CQ0KLQkJZmluYWwgSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSB0eXBlPT1udWxsID8gbnVsbCA6IHJlc291cmNlKCkubmV3QW5ub3RhdGlvbkluc3BlY3Rvcih0eXBlKS5pbnNwZWN0VHlwZShXU19BTk5PVEFUSU9OKTsNCi0JCWlmICh0eXBlID09IG51bGwgfHwgYW5ub3RhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCXVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhjdSk7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChjdSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIGN1LmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJYXNzZXJ0IHdzUHJvamVjdCAhPSBudWxsOw0KLQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcm9qZWN0LCBjdSk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN1YmNsYXNzaW5nV1NFbGVtZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqIDogZ2V0RG9tQmVpbmdMb2FkZWQoKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKSkNCi0JCXsNCi0JCQlmaW5hbCBJSmF2YVByb2plY3QgamF2YVByaiA9IGphdmFNb2RlbCgpLmdldEphdmFQcm9qZWN0KHdzUHJqLmdldE5hbWUoKSk7DQotCQkJZm9yIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKT09bnVsbCkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJaWYgKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKS5jb250YWlucyhjdSkpDQotCQkJCXsNCi0JCQkJCXByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGphdmFQcmouZmluZFR5cGUoc2VpLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlmb3IgKElXZWJTZXJ2aWNlIHdzIDogd3NQcmouZ2V0V2ViU2VydmljZXMoKSkNCi0JCQl7DQotCQkJCWlmKHNlcnZpY2VEYXRhKCkuZ2V0SGllcmFyY2h5KHdzLmdldEltcGxlbWVudGF0aW9uKCkpPT1udWxsKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlpZiAoc2VydmljZURhdGEoKS5nZXRIaWVyYXJjaHkod3MuZ2V0SW1wbGVtZW50YXRpb24oKSkuY29udGFpbnMoY3UpKQ0KLQkJCQl7DQotCQkJCQlwcm9jZXNzQ29tcGlsYXRpb25Vbml0KHdzUHJqLCBqYXZhUHJqLmZpbmRUeXBlKHdzLmdldEltcGxlbWVudGF0aW9uKCkpLmdldENvbXBpbGF0aW9uVW5pdCgpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBhZGRlZENVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBhZGRlZENVLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQl0aGlzLnByb2Nlc3NDb21waWxhdGlvblVuaXQod3NQcmosIGFkZGVkQ1UpOw0KLQl9DQotDQotCXZvaWQgaGFuZGxlTW92ZWRUb0NvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGZyb21DVSwgSUNvbXBpbGF0aW9uVW5pdCB0b0NVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElKYXZhV2ViU2VydmljZUVsZW1lbnQgd3NFbGVtID0gZ3Vlc3NDb250YWluZWRXU0VsZW1lbnQoZnJvbUNVKTsNCi0JCWlmICh3c0VsZW0gPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlmaW5hbCBib29sZWFuIGZxTmFtZUNoYW5nZWQgPSAhdG9DVS5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhmcm9tQ1UuZ2V0RWxlbWVudE5hbWUoKSkNCi0JCQkJCQkJCQkJfHwgIXRvQ1UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoZnJvbUNVLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJaWYgKGZxTmFtZUNoYW5nZWQpDQotCQl7DQotCQkJaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChmcm9tQ1UpOw0KLQkJCWhhbmRsZUFkZGVkQ29tcGlsYXRpb25Vbml0KHRvQ1UpOw0KLQkJfSBlbHNlDQotCQkvLyB0aGVuIGFzc3VtZSB0aGF0IHRoZSBwcm9qZWN0IG9ubHkgaGFzIGNoYW5nZWQuDQotCQl7DQotCQkJZmluYWwgSVdlYlNlcnZpY2VQcm9qZWN0IHRvUHJqID0gdXRpbCgpLmZpbmRQcm9qZWN0QnlOYW1lKGdldERvbUJlaW5nTG9hZGVkKCksIHRvQ1UuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCQlpZiAod3NFbGVtIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpDQotCQkJew0KLQkJCQl0b1Byai5nZXRXZWJTZXJ2aWNlcygpLmFkZCgoSVdlYlNlcnZpY2UpIHdzRWxlbSk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQl0b1Byai5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuYWRkKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB3c0VsZW0pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IHJlbUNVKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCByZW1DVS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmVtb3ZlTW9kZWxFbGVtZW50cyh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUocmVtQ1UpLCBmYWxzZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1vZGVsRWxlbWVudHMoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJqLCBTdHJpbmcgaW1wbEJhc2VOYW1lLCBib29sZWFuIGlzRm9yUGFja2FnZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAod3NQcmogPT0gbnVsbCkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXJlbW92ZVdzTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UpOw0KLQkJcmVtb3ZlU2VpTW9kZWxFbGVtZW50cyh3c1ByaiwgaW1wbEJhc2VOYW1lLCBpc0ZvclBhY2thZ2UsIGZhbHNlKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGd1ZXNzQ29udGFpbmVkV1NFbGVtZW50KElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1ByaiA9IHV0aWwoKS5maW5kUHJvamVjdEJ5TmFtZShnZXREb21CZWluZ0xvYWRlZCgpLCBjdS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLQkJcmV0dXJuIHV0aWwoKS5maW5kSmF2YVdlYlNlcnZpY2VFbGVtQnlJbXBsTmFtZSh3c1ByaiwgZ3Vlc3NQcmltYXJ5VHlwZU5hbWUoY3UpKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1ZXNzUHJpbWFyeVR5cGVOYW1lKElDb21waWxhdGlvblVuaXQgY3UpDQotCXsNCi0JCWZpbmFsIFN0cmluZyBwYXJlbnROYW1lID0gY3UuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgYXNzdW1lZFByaW1hcnlUeXBlTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQotCQlpZiAocGFyZW50TmFtZS5sZW5ndGgoKSA+IDApIHsNCi0JCQlhc3N1bWVkUHJpbWFyeVR5cGVOYW1lIC5hcHBlbmQocGFyZW50TmFtZSkuYXBwZW5kKCcuJyk7DQotCQl9DQotCQlyZXR1cm4gYXNzdW1lZFByaW1hcnlUeXBlTmFtZS5hcHBlbmQoY3UuZ2V0RWxlbWVudE5hbWUoKSkuDQotCQkJZGVsZXRlKGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGFzdEluZGV4T2YoIi5qYXZhIiksIGFzc3VtZWRQcmltYXJ5VHlwZU5hbWUubGVuZ3RoKCkpLnRvU3RyaW5nKCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9QYXJhbWV0ZXJTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjU1OTAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvUGFyYW1ldGVyU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XUEFubm90YXRpb25GZWF0dXJlcy5IRUFERVJfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk1PREVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLk5BTUVfQVRUUklCVVRFOw0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5XZWJQYXJhbUtpbmQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uSW5zcGVjdG9yOw0KLQ0KLS8qKg0KLSAqIENsYXNzIHRoYXQgc3luY2hyb25pemVzIHRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgSVdlYk1ldGhvZH0gb2JqZWN0Ow0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFBhcmFtZXRlclN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX1BBUkFNX05BTUUJPSAicmV0dXJuIjsvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfTkFNRSA9ICJIb2xkZXIiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT0xERVJfQ0xBU1NfRlFOQU1FID0gImphdmF4LnhtbC53cy5Ib2xkZXIiOy8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBQYXJhbWV0ZXJTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVQYXJhbWV0ZXJzKElXZWJNZXRob2Qgd20sIElNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV2ViUGFyYW0+IG1lcmdlZFBhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PElXZWJQYXJhbT4oKTsNCi0JCWlmICghU2lnbmF0dXJlLlNJR19WT0lELmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkNCi0JCXsNCi0JCQlmaW5hbCBJV2ViUGFyYW0gcmV0UGFyYW0gPSBvYnRhaW5JbnN0YW5jZSh3bSwgUkVUVVJOX1BBUkFNX05BTUUpOw0KLQkJCW1lcmdlUGFyYW0ocmV0UGFyYW0sIDAsIHdtLCBtZXRob2QsIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChyZXRQYXJhbSk7DQotCQl9DQotCQlmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpOw0KLQkJZmluYWwgU3RyaW5nW10gdHlwZVNpZ25hdHVyZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsgDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCWZpbmFsIElXZWJQYXJhbSBwYXJhbSA9IG9idGFpbkluc3RhbmNlKHdtLCBuYW1lc1tpXSk7DQotCQkJbWVyZ2VQYXJhbShwYXJhbSwgaSwgd20sIG1ldGhvZCwgdHlwZVNpZ25hdHVyZXNbaV0sIGluc3BlY3Rvcik7DQotCQkJbWVyZ2VkUGFyYW1zLmFkZChwYXJhbSk7DQotCQl9DQotCQl3bS5nZXRQYXJhbWV0ZXJzKCkucmV0YWluQWxsKG1lcmdlZFBhcmFtcyk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1lcmdlUGFyYW0oSVdlYlBhcmFtIHdlYlBhcmFtLCBpbnQgcG9zLCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgSU1ldGhvZCBtZXRob2QsIFN0cmluZyB0eXBlU2lnbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIElUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHdlYlBhcmFtLmdldEltcGxlbWVudGF0aW9uKCkpOw0KLQkJYXNzZXJ0IHR5cGVQYXJhbSE9IG51bGw7DQotCQkNCi0JCWZpbmFsIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB3cEFubm90YXRpb24gPSBpc1dlYlJlc3VsdCh3ZWJQYXJhbSkgPyBudWxsIDogaW5zcGVjdG9yLmluc3BlY3RQYXJhbSh0eXBlUGFyYW0sIFdQX0FOTk9UQVRJT04pOw0KLQkJCQkNCi0JCWlmICghIHR5cGVTaWduLmVxdWFscyh3ZWJQYXJhbS5nZXRUeXBlTmFtZSgpKSkgew0KLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod2ViUGFyYW0sIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCB0eXBlU2lnbik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFdlYlBhcmFtS2luZCBraW5kID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gV2ViUGFyYW1LaW5kLk9VVCA6IGNhbGNLaW5kKHdwQW5ub3RhdGlvbiwgbWV0aG9kLCB0eXBlU2lnbik7DQotCQlpZiAoIWtpbmQuZXF1YWxzKHdlYlBhcmFtLmdldEtpbmQoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXRLaW5kKGtpbmQpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBib29sZWFuIGlzSGVhZGVyID0gY2FsY0hlYWRlcih3cEFubm90YXRpb24pOw0KLQkJaWYgKHdlYlBhcmFtLmlzSGVhZGVyKCkgXiBpc0hlYWRlcikgew0KLQkJCXdlYlBhcmFtLnNldEhlYWRlcihpc0hlYWRlcik7DQotCQl9DQotCQkNCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gaXNXZWJSZXN1bHQod2ViUGFyYW0pID8gZGVmQ2FsYygpLmNhbGNXZWJSZXN1bHREZWZhdWx0TmFtZSh3ZWJNZXRob2QpIDogY2FsY05hbWUod3BBbm5vdGF0aW9uLCB3ZWJNZXRob2QsIHBvcyk7DQotCQlpZiAoIW5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldE5hbWUoKSkpIHsNCi0JCQl3ZWJQYXJhbS5zZXROYW1lKG5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgcGFydE5hbWUgPSBjYWxjUGFydE5hbWUod3BBbm5vdGF0aW9uLCBuYW1lKTsNCi0JCWlmICghcGFydE5hbWUuZXF1YWxzKHdlYlBhcmFtLmdldFBhcnROYW1lKCkpKSB7DQotCQkJd2ViUGFyYW0uc2V0UGFydE5hbWUocGFydE5hbWUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlID0gY2FsY1RhcmdldE5hbWVzcGFjZSh3cEFubm90YXRpb24sIHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQkJaWYgKCF0YXJnZXROYW1lc3BhY2UuZXF1YWxzKHdlYlBhcmFtLmdldFRhcmdldE5hbWVzcGFjZSgpKSkgew0KLQkJCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSh0YXJnZXROYW1lc3BhY2UpOw0KLQkJfQkJDQotCQkNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdCh3ZWJQYXJhbSwgSUFubm90YXRpb25TZXJpYWxpemVyLmNsYXNzKTsJCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OLCB3cEFubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJSZXN1bHQoZmluYWwgSVdlYlBhcmFtIHBhcmFtKQ0KLQl7DQotCQlyZXR1cm4gcGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoUkVUVVJOX1BBUkFNX05BTUUpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZmluYWwgSU1ldGhvZCBtZXRob2QsIGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0Jew0KLQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkNCi0JCXsNCi0JCQlyZXR1cm4gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVTaWduYXR1cmUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTdHJpbmdbXVtdIHJlc29sdmVkVHlwZXMgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLnJlc29sdmVUeXBlKFNpZ25hdHVyZS50b1N0cmluZyh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAocmVzb2x2ZWRUeXBlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkDQotCQl9DQotCQlmaW5hbCBTdHJpbmcgcGFjayA9IHJlc29sdmVkVHlwZXNbMF1bMF07DQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gcmVzb2x2ZWRUeXBlc1swXVsxXTsNCi0JCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5sZW5ndGgoKSAhPSAwKQ0KLQkJew0KLQkJCXJldHVybiBwYWNrICsgIi4iICsgY2xhc3NOYW1lOy8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJldHVybiBjbGFzc05hbWU7DQotCQl9DQotCX0NCi0JDQotCXByb3RlY3RlZCBXZWJQYXJhbUtpbmQgY2FsY0tpbmQoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHBhcm1Bbm5vdGF0aW9uLCBmaW5hbCBJTWV0aG9kIG1ldGhvZCwgZmluYWwgU3RyaW5nIHR5cGVTaWduYXR1cmUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocGFybUFubm90YXRpb24gIT0gbnVsbCAmJiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE1PREVfQVRUUklCVVRFKSAhPSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIFN0cmluZyBtb2RlID0gcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShNT0RFX0FUVFJJQlVURSk7DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOT1VULmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTk9VVDsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX0lOLmVuZHNXaXRoKG1vZGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIFdlYlBhcmFtS2luZC5JTjsNCi0JCQl9DQotCQkJaWYgKFdQQW5ub3RhdGlvbkZlYXR1cmVzLldFQl9QQVJBTV9NT0RFX09VVC5lbmRzV2l0aChtb2RlKSkNCi0JCQl7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuT1VUOw0KLQkJCX0NCi0JCX0gDQotCQkNCi0JCWlmIChpc1Bvc3NpYmx5SG9sZGVyQ2xhc3ModHlwZVNpZ25hdHVyZSkpIHsNCi0JCQlmaW5hbCBTdHJpbmcgdHlwZUZRTmFtZSA9IHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUobWV0aG9kLCB0eXBlU2lnbmF0dXJlKTsNCi0JCQlpZiAodHlwZUZRTmFtZS5zdGFydHNXaXRoKEhPTERFUl9DTEFTU19GUU5BTUUpKSB7DQotCQkJCXJldHVybiBXZWJQYXJhbUtpbmQuSU5PVVQ7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gV2ViUGFyYW1LaW5kLklOOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWRkZWQgZHVlIHRvIHBlcmZvcm1hbmNlIGlzc3VlcyBDU04gMDEyMDA2MTUzMiAwMDAyMjU2OTI1IDIwMDkuDQotCSAqIFRoZSBpZGVhIGlzIHRoYXQgYmVmb3JlIGNhbGxpbmcge0BsaW5rICNyZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKElNZXRob2QsIFN0cmluZyl9DQotCSAqIHdlIGNoZWNrIGlmIHRoZSBjbGFzcyBpcyBwb3RlbnRpYWxseSBIb2xkZXIuDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gaXNQb3NzaWJseUhvbGRlckNsYXNzKGZpbmFsIFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7CQ0KLQkJZmluYWwgU3RyaW5nIGVyYXN1dGVUeXBlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaWduYXR1cmVTaW1wbGVOYW1lKFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKSk7DQotCQlpZiAoSE9MREVSX0NMQVNTX05BTUUuZXF1YWxzKGVyYXN1dGVUeXBlTmFtZSkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjTmFtZShJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gcGFybUFubm90YXRpb24sIElXZWJNZXRob2Qgd2ViTWV0aG9kLCBpbnQgcGFyYW1Qb3NpdGlvbikNCi0Jew0KLQkJaWYgKHBhcm1Bbm5vdGF0aW9uICE9IG51bGwgJiYgcGFybUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShOQU1FX0FUVFJJQlVURSkgIT0gbnVsbCkgew0KLQkJCXJldHVybiBwYXJtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGRlZkNhbGMoKS5jYWxjV2ViUGFyYW1EZWZhdWx0TmFtZSh3ZWJNZXRob2QsIHBhcmFtUG9zaXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBjYWxjUGFydE5hbWUoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbiwgZmluYWwgU3RyaW5nIG5hbWUpIA0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpIT1udWxsKSB7DQotCQkJcmV0dXJuIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBBUlRfTkFNRV9BVFRSSUJVVEUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGNhbGNIZWFkZXIoZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHdwQW5ub3RhdGlvbikNCi0Jew0KLQkJaWYgKHdwQW5ub3RhdGlvbiE9bnVsbCAmJiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbih3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShIRUFERVJfQVRUUklCVVRFKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY1RhcmdldE5hbWVzcGFjZShmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gd3BBbm5vdGF0aW9uLCBmaW5hbCBJV2ViTWV0aG9kIHdlYk1ldGhvZCwgZmluYWwgSVdlYlBhcmFtIHdlYlBhcmFtKQ0KLQl7DQotCQlpZiAod3BBbm5vdGF0aW9uIT1udWxsICYmIHdwQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKSE9bnVsbCkgew0KLQkJCXJldHVybiB3cEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShUQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBkZWZDYWxjKCkuY2FsY1dlYlBhcmFtRGVmYXVsdFRhcmdldE5TKHdlYk1ldGhvZCwgd2ViUGFyYW0pOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBvYnRhaW5JbnN0YW5jZShJV2ViTWV0aG9kIHdtLCBTdHJpbmcgaW1wbCkNCi0Jew0KLQkJZmluYWwgSVdlYlBhcmFtIGV4aXN0aW5nID0gZmluZFdlYlBhcmFtQnlJbXBsTmFtZSh3bSwgaW1wbCk7DQotCQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZXhpc3Rpbmc7DQotCQl9DQotCQlmaW5hbCBJV2ViUGFyYW0gbmV3UGFyYW0gPSBkb21GYWN0b3J5KCkuY3JlYXRlSVdlYlBhcmFtKCk7DQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1BhcmFtLCBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0lNUExFTUVOVEFUSU9OLCBpbXBsKTsNCi0JCXdtLmdldFBhcmFtZXRlcnMoKS5hZGQobmV3UGFyYW0pOw0KLQkJcmV0dXJuIG5ld1BhcmFtOw0KLQl9DQotCQ0KLQlwcml2YXRlIElXZWJQYXJhbSBmaW5kV2ViUGFyYW1CeUltcGxOYW1lKGZpbmFsIElXZWJNZXRob2Qgd20sIGZpbmFsIFN0cmluZyBpbXBsKQ0KLQl7DQotCQlmb3IgKElXZWJQYXJhbSBwYXJhbSA6IHdtLmdldFBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAoaW1wbC5lcXVhbHMocGFyYW0uZ2V0SW1wbGVtZW50YXRpb24oKSkpDQotCQkJew0KLQkJCQlyZXR1cm4gcGFyYW07DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGNlODIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLlNCQW5ub3RhdGlvbkZlYXR1cmVzLlNCX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuTkFNRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuVEFSR0VUX05BTUVTUEFDRV9BVFRSSUJVVEU7DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nUGFyYW1ldGVyU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuU09BUEJpbmRpbmdTdHlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1VzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgdGhhdCBtZXJnZXMgY29udGVudCBvZiB7QGxpbmsgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0gd2l0aCB0aGUgY3VycmVudCBjb250ZW50IG9mIA0KLSAqIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgaXQuICANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIFNlaU1lcmdlciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmNocm9uaXplcjsNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiBAcGFyYW0gcGFyZW50DQotCSAqIEBwYXJhbSBtZXRob2RTeW5jIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB0YWtlcyBjYXJlIGZvciB0aGUgU0VJIG1ldGhvZHMNCi0JICovDQotCXB1YmxpYyBTZWlNZXJnZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQsIEFic3RyYWN0TWV0aG9kU3luY2hyb25pemVyIG1ldGhvZFN5bmMpIA0KLQl7DQotCQlzdXBlcihwYXJlbnQpOw0KLQkJbnVsbENoZWNrUGFyYW0obWV0aG9kU3luYyk7DQotCQl0aGlzLm1ldGhvZFN5bmNocm9uaXplciA9IG1ldGhvZFN5bmM7DQotCX0NCi0JCQ0KLQlwcm90ZWN0ZWQgdm9pZCBtZXJnZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgSUFubm90YXRpb248SVR5cGU+IHdzQW5ub3RhdGlvbiwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyBzZWlOYW1lID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPyANCi0JCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKE5BTUVfQVRUUklCVVRFKTsNCi0JCQkJDQotCQlpZiAoIXNlaU5hbWUuZXF1YWxzKHNlaS5nZXROYW1lKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19OQU1FLCBzZWlOYW1lKTsNCi0JCX0NCi0JCQkJDQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlDQotCQlmaW5hbCBTdHJpbmcgdGFyZ2V0TnMgPSBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKHdzQW5ub3RhdGlvbik7DQotCQlpZiAoIXRhcmdldE5zLmVxdWFscyhzZWkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpKSB7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFLCB0YXJnZXROcyk7DQotCQl9DQotCQkNCi0JCW1lcmdlU29hcEJpbmRpbmcoc2VpLCBpbnNwZWN0b3IpOw0KLQkJbWV0aG9kU3luY2hyb25pemVyLnN5bmNocm9uaXplTWV0aG9kcyhzZWksIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLCBpbnNwZWN0b3IpOw0KLQkJDQotCQlhZGFwdFRvTG9jYXRpb25JbnRlcmZhY2Uoc2VpLCBXU19BTk5PVEFUSU9OLCB3c0Fubm90YXRpb24pOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pDQotCXsNCi0JCS8vIGFkZCB0YXJnZXROYW1lc3BhY2UNCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsNCi0JCWlmICh0YXJnZXROcz09bnVsbCkgew0KLQkJCXJldHVybiBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCX0JDQotCQkNCi0JCXJldHVybiB0YXJnZXROczsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIG1lcmdlU29hcEJpbmRpbmcoZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBJQW5ub3RhdGlvbjxJVHlwZT4gc2JBbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFNCX0FOTk9UQVRJT04pOw0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1N0eWxlIHN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdTdHlsZSgpICE9IHN0eWxlKSB7DQotCQkJc2VpLnNldFNvYXBCaW5kaW5nU3R5bGUoc3R5bGUpOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBTT0FQQmluZGluZ1VzZSB1c2UgPSBkZWZDYWxjKCkuZGVmaW5lU0JVc2Uoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdVc2UoKSAhPSB1c2UpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdVc2UodXNlKTsNCi0JCX0NCi0JCQ0KLQkJZmluYWwgU09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSBwYXJhbVN0eWxlID0gZGVmQ2FsYygpLmRlZmluZVNCUGFyYW1ldGVyU3R5bGUoc2JBbm5vdGF0aW9uKTsNCi0JCWlmIChzZWkuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpICE9IHBhcmFtU3R5bGUpIHsNCi0JCQlzZWkuc2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZShwYXJhbVN0eWxlKTsNCi0JCX0NCi0JCQ0KLQkJYWRhcHRUb0xvY2F0aW9uSW50ZXJmYWNlKHNlaSwgU0JfQU5OT1RBVElPTiwgc2JBbm5vdGF0aW9uKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzNTRmNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1NlaU1ldGhvZFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2Uuc3luYzsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotY2xhc3MgU2VpTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBTZWlNZXRob2RTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHZpc2l0RXhwb3NhYmxlTWV0aG9kcyhJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQl2aXNpdFJlY3Vyc2l2ZWx5KHZpc2l0b3IsIGhpZXJhcmNoeS5nZXRUeXBlKCksIGhpZXJhcmNoeSwgaW5zcGVjdG9yKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdmlzaXRSZWN1cnNpdmVseShJTWV0aG9kVmlzaXRvciB2aXNpdG9yLCBJVHlwZSB0eXBlLCBJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHksIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJdmlzaXRvci52aXNpdChtZXRob2QsIGluc3BlY3Rvcik7DQotCQl9DQotDQotCQlmb3IgKElUeXBlIHN1cGVySW50ZiA6IGhpZXJhcmNoeS5nZXRTdXBlckludGVyZmFjZXModHlwZSkpDQotCQl7CQkJDQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlckludGYsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVySW50ZikpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9TZWlTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOThlZmE3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3BlcnNpc3RlbmNlL3N5bmMvU2VpU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JTW9kZWxFbGVtZW50U3luY2hyb25pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsNCi0NCi0vKioNCi0gKiBTeW5jaHJvbml6ZXIgZm9yIGV4cGxpY2l0IHtAbGluayBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBpbnN0YW5jZS4gVXBkYXRlcyB0aGUgRE9NIGluc3RhbmNlIHRvIHRoZSBjdXJyZW50DQotICogU0VJIGltcGxlbWVudGF0aW9uIGNsYXNzIGJ5IHJlYWRpbmcgcmVsZXZhbnQgYW5ub3RhdGlvbnMgYW5kIA0KLSAqIA0KLSAqIEBhdXRob3IgDQotICovDQotcHVibGljIGNsYXNzIFNlaVN5bmNocm9uaXplciBleHRlbmRzIEVsZW1lbnRTeW5jaHJvbml6ZXJJbXBsDQotew0KLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7IA0KLQ0KLQlTZWlTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpDQotCXsNCi0JCXN1cGVyKHBhcmVudCk7DQotCQlzZWlNZXJnZXIgPSBuZXcgU2VpTWVyZ2VyKHRoaXMsIG5ldyBTZWlNZXRob2RTeW5jaHJvbml6ZXIodGhpcykpOw0KLQl9DQotDQotCS8qIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgKi8NCi0Jdm9pZCBzeW5jaHJvbml6ZUludGVyZmFjZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkgPSBvYnRhaW5JbnN0YW5jZSh3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0JCXNlaU1lcmdlci5tZXJnZShzZWksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsNCi0JCXJlc29sdmVXc1JlZnNUb1RoaXNTZWkoc2VpKTsNCi0JCXJlc291cmNlKCkuZ2V0U2VyaWFsaXplckZhY3RvcnkoKS5hZGFwdChzZWksIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7CQkNCi0JfQ0KLQ0KLQlwcml2YXRlIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugb2J0YWluSW5zdGFuY2UoSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdCwgU3RyaW5nIGltcGxOYW1lKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IG51bGw7DQotCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZXhpc3RpbmcgOiB3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpKQ0KLQkJew0KLQkJCWlmIChleGlzdGluZy5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyhpbXBsTmFtZSkpIHsNCi0JCQkJc2VpID0gZXhpc3Rpbmc7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2VpPT1udWxsKQ0KLQkJew0KLQkJCXNlaSA9IGRvbUZhY3RvcnkoKS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7DQotCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sIGltcGxOYW1lKTsNCi0JCQl3c1Byb2plY3QuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlcygpLmFkZChzZWkpOw0KLQkJfQ0KLQkJDQotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHNlaSwgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfX0lNUExJQ0lULCBmYWxzZSk7DQotCQkNCi0JCXJldHVybiBzZWk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVXc1JlZnNUb1RoaXNTZWkoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpDQotCXsNCi0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiBzZXJ2aWNlRGF0YSgpLmdldEltcGxlbWVudGluZ1dzKHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpKSkNCi0JCXsNCi0JCQlpZiAod3MuZ2V0U2VydmljZUVuZHBvaW50KCkgIT0gc2VpKQ0KLQkJCXsNCi0JCQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHNlaSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9XU01ldGhvZFN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkwOTM0ZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dTTWV0aG9kU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOw0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0FOTk9UQVRJT047DQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XTUFubm90YXRpb25GZWF0dXJlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFdTTWV0aG9kU3luY2hyb25pemVyIGV4dGVuZHMgQWJzdHJhY3RNZXRob2RTeW5jaHJvbml6ZXINCi17DQotDQotCXB1YmxpYyBXU01ldGhvZFN5bmNocm9uaXplcihJTW9kZWxFbGVtZW50U3luY2hyb25pemVyIHBhcmVudCkNCi0Jew0KLQkJc3VwZXIocGFyZW50KTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRFeHBvc2FibGVNZXRob2RzKElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXZpc2l0UmVjdXJzaXZlbHkodmlzaXRvciwgaGllcmFyY2h5LmdldFR5cGUoKSwgaGllcmFyY2h5LCBpbnNwZWN0b3IpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCB2aXNpdFJlY3Vyc2l2ZWx5KElNZXRob2RWaXNpdG9yIHZpc2l0b3IsIElUeXBlIHR5cGUsIElUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSwgSUFubm90YXRpb25JbnNwZWN0b3IgaW5zcGVjdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICh0eXBlID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkNCi0JCWFzc2VydCB0eXBlLmlzQ2xhc3MoKTsNCi0JCWZpbmFsIGJvb2xlYW4gaXNXZWJTZXJ2aWNlID0gaW5zcGVjdG9yLmluc3BlY3RUeXBlKFdTX0FOTk9UQVRJT04pICE9IG51bGw7DQotCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdHlwZS5nZXRNZXRob2RzKCkpDQotCQl7DQotCQkJaWYobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkNCi0JCQl7DQotCQkJCS8vIENvbnN0cnVjdG9ycyBjYW4gbmV2ZXIgdGFrZSBwYXJ0IGluIHRoZSBwb3J0dHlwZQ0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gd21Bbm5vdGF0aW9uID0gaW5zcGVjdG9yLmluc3BlY3RNZXRob2QobWV0aG9kLCBXTV9BTk5PVEFUSU9OKTsNCi0JCQlmaW5hbCBib29sZWFuIGlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiA9IHdtQW5ub3RhdGlvbiA9PSBudWxsID8gZmFsc2UgOiAidHJ1ZSIuZXF1YWxzKHdtQW5ub3RhdGlvbi8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCS5nZXRQcm9wZXJ0eVZhbHVlKFdNQW5ub3RhdGlvbkZlYXR1cmVzLldNX0VYQ0xVREVEX0FUVFJJQlVURSkpOw0KLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkgJiYgIWlzRXhjbHVkZWRXaXRoQW5ub3RhdGlvbiAmJiAoaXNXZWJTZXJ2aWNlIHx8IHdtQW5ub3RhdGlvbiAhPSBudWxsKSkNCi0JCQl7DQotCQkJCXZpc2l0b3IudmlzaXQobWV0aG9kLCBpbnNwZWN0b3IpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJZmluYWwgSVR5cGUgc3VwZXJUeXBlID0gaGllcmFyY2h5LmdldFN1cGVyY2xhc3ModHlwZSk7DQotCQlpZiAoc3VwZXJUeXBlIT1udWxsKSB7DQotCQkJdmlzaXRSZWN1cnNpdmVseSh2aXNpdG9yLCBzdXBlclR5cGUsIGhpZXJhcmNoeSwgcmVzb3VyY2UoKS5uZXdBbm5vdGF0aW9uSW5zcGVjdG9yKHN1cGVyVHlwZSkpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcGVyc2lzdGVuY2Uvc3luYy9Xc1N5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyNGZlODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wZXJzaXN0ZW5jZS9zeW5jL1dzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zeW5jOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5FTkRQT0lOVF9JTlRFUkZBQ0VfQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuUE9SVF9OQU1FX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLlNFUlZJQ0VfTkFNRV9BVFRSSUJVVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5XU0Fubm90YXRpb25GZWF0dXJlcy5UQVJHRVRfTkFNRVNQQUNFX0FUVFJJQlVURTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLldTQW5ub3RhdGlvbkZlYXR1cmVzLldTRExfTE9DQVRJT05fQVRUUklCVVRFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1NBbm5vdGF0aW9uRmVhdHVyZXMuV1NfQU5OT1RBVElPTjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5JQW5ub3RhdGlvblNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLklNb2RlbEVsZW1lbnRTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkpheFdzVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLQotcHVibGljIGNsYXNzIFdzU3luY2hyb25pemVyIGV4dGVuZHMgRWxlbWVudFN5bmNocm9uaXplckltcGwKLXsKLQlwcml2YXRlIGZpbmFsIFNlaU1lcmdlciBzZWlNZXJnZXI7Ci0KLQlwdWJsaWMgV3NTeW5jaHJvbml6ZXIoSU1vZGVsRWxlbWVudFN5bmNocm9uaXplciBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNlaU1lcmdlciA9IG5ldyBTZWlNZXJnZXIodGhpcywgbmV3IFdTTWV0aG9kU3luY2hyb25pemVyKHRoaXMpKTsKLQl9Ci0KLQlwcml2YXRlIElXZWJTZXJ2aWNlIG9idGFpbkluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIFN0cmluZyBpbXBsTmFtZSkKLQl7Ci0JCWZvciAoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkKLQkJewotCQkJaWYgKHdzLmdldEltcGxlbWVudGF0aW9uKCkhPSBudWxsICYmIHdzLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gd3M7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgSVdlYlNlcnZpY2UgbmV3V3MgPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViU2VydmljZSgpOwotCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKG5ld1dzLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCBpbXBsTmFtZSk7Ci0JCXV0aWwoKS5hZGRUb0NvbGxlY3Rpb25GZWF0dXJlKHdzUHJvamVjdCwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTLCBuZXdXcyk7Ci0JCQotCQlyZXR1cm4gbmV3V3M7Ci0JfQotCi0JcHVibGljIElXZWJTZXJ2aWNlIHN5bmNocm9uaXplV2ViU2VydmljZShJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0LCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uLCBJQW5ub3RhdGlvbkluc3BlY3RvciBpbnNwZWN0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXZWJTZXJ2aWNlIHdzID0gb2J0YWluSW5zdGFuY2Uod3NQcm9qZWN0LCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCW1lcmdlV2ViU2VydmljZSh3cywgd3NQcm9qZWN0LCB3c0Fubm90YXRpb24sIGluc3BlY3Rvcik7Ci0JCQotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQod3MsIElBbm5vdGF0aW9uU2VyaWFsaXplci5jbGFzcyk7Ci0JCWFkYXB0VG9Mb2NhdGlvbkludGVyZmFjZSh3cywgV1NfQU5OT1RBVElPTiwgd3NBbm5vdGF0aW9uKTsKLQkJCi0JCXJldHVybiB3czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VXZWJTZXJ2aWNlKElXZWJTZXJ2aWNlIHRvTWVyZ2UsIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJLy8gYWRkIHNlcnZpY2VOYW1lIG5hbWUKLQkJZmluYWwgU3RyaW5nIHdzTmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpID09IG51bGwgPwotCQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKHdzQW5ub3RhdGlvbi5nZXRBcHBsaWVkRWxlbWVudCgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSA6IAotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFNFUlZJQ0VfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXdzTmFtZS5lcXVhbHModG9NZXJnZS5nZXROYW1lKCkpKQotCQl7Ci0JCQl1dGlsKCkuc2V0RmVhdHVyZVZhbHVlKHRvTWVyZ2UsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19OQU1FLCB3c05hbWUpOwotCQl9Ci0JCQotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IGV4dHJhY3RUYXJnZXROYW1lc3BhY2Uod3NBbm5vdGF0aW9uKTsKLQkJaWYgKCF0YXJnZXROcy5lcXVhbHModG9NZXJnZS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUodG9NZXJnZSwgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsIHRhcmdldE5zKTsKLQkJfQotCQkKLQkJLy8gYWRkIHBvcnROYW1lCi0JCWZpbmFsIFN0cmluZyBwb3J0TmFtZSA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsID8KLQkJCQlKYXhXc1V0aWxzLmdldERlZmF1bHRQb3J0TmFtZSh3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkgOgotCQkJCXdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFBPUlRfTkFNRV9BVFRSSUJVVEUpOwotCQkJCQotCQlpZiAoIXBvcnROYW1lLmVxdWFscyh0b01lcmdlLmdldFBvcnROYW1lKCkpKSB7Ci0JCQl0b01lcmdlLnNldFBvcnROYW1lKHBvcnROYW1lKTsKLQkJfQotCQkKLQkJLy8gYWRkIHdzZGxMb2NhdGlvbgotCQl0b01lcmdlLnNldFdzZGxMb2NhdGlvbih3c0Fubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZShXU0RMX0xPQ0FUSU9OX0FUVFJJQlVURSkpOwotCQkKLQkJLy8gYWRkIGVuZHBvaW50SW50ZXJmYWNlCi0JCWZpbmFsIFN0cmluZyBuZXdTZWlJbXBsID0gd3NBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoRU5EUE9JTlRfSU5URVJGQUNFX0FUVFJJQlVURSk7Ci0JCWlmIChuZXdTZWlJbXBsID09IG51bGwpCi0JCXsKLQkJCW1lcmdlSW1wbGljaXRJbnRlcmZhY2Uob2J0YWluSW1wbGljaXRJbnRlcmZhY2VJbnN0YW5jZSh3c1Byb2plY3QsIHRvTWVyZ2UsIHdzQW5ub3RhdGlvbiksIHdzQW5ub3RhdGlvbiwgaW5zcGVjdG9yKTsKLQkJfSBlbHNlCi0JCXsKLQkJCWlmICh0b01lcmdlLmdldFNlcnZpY2VFbmRwb2ludCgpID09IG51bGwgfHwgIXRvTWVyZ2UuZ2V0U2VydmljZUVuZHBvaW50KCkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMobmV3U2VpSW1wbCkpCi0JCQl7Ci0JCQkJc2VydmljZURhdGEoKS5tYXAodG9NZXJnZSwgbmV3U2VpSW1wbCk7Ci0JCQkJcmVzb2x2ZUludGVyZmFjZSh0b01lcmdlLCB3c1Byb2plY3QsIHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKEVORFBPSU5UX0lOVEVSRkFDRV9BVFRSSUJVVEUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYnRhaW5JbXBsaWNpdEludGVyZmFjZUluc3RhbmNlKElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3QsIElXZWJTZXJ2aWNlIHdzLCBJQW5ub3RhdGlvbjxJVHlwZT4gd3NBbm5vdGF0aW9uKQotCXsKLQkJaWYgKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpICE9IG51bGwgJiYgd3MuZ2V0U2VydmljZUVuZHBvaW50KCkuaXNJbXBsaWNpdCgpKQotCQl7Ci0JCQlyZXR1cm4gd3MuZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0JCX0KLQotCQlmaW5hbCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZShzZWksIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwgdHJ1ZSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUoc2VpLCBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLCB3c0Fubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCXV0aWwoKS5zZXRGZWF0dXJlVmFsdWUod3MsIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX19TRVJWSUNFX0VORFBPSU5ULCBzZWkpOwotCQkKLQkJd3NQcm9qZWN0LmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKS5hZGQoc2VpKTsKLQkJCi0JCXJldHVybiBzZWk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1lcmdlSW1wbGljaXRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWksIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24sIElBbm5vdGF0aW9uSW5zcGVjdG9yIGluc3BlY3RvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJc2VpTWVyZ2VyLm1lcmdlKHNlaSwgd3NBbm5vdGF0aW9uLCBpbnNwZWN0b3IpOwotCQlyZXNvdXJjZSgpLmdldFNlcmlhbGl6ZXJGYWN0b3J5KCkuYWRhcHQoc2VpLCBJQW5ub3RhdGlvblNlcmlhbGl6ZXIuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFyZ2V0TmFtZXNwYWNlKGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0Fubm90YXRpb24pCi0JewotCQkvLyBhZGQgdGFyZ2V0TmFtZXNwYWNlCi0JCWZpbmFsIFN0cmluZyB0YXJnZXROcyA9IHdzQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFRBUkdFVF9OQU1FU1BBQ0VfQVRUUklCVVRFKTsKLQkJaWYgKHRhcmdldE5zPT1udWxsKSB7Ci0JCQlyZXR1cm4gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2Uod3NBbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0JCi0JCQotCQlyZXR1cm4gdGFyZ2V0TnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVJbnRlcmZhY2UoSVdlYlNlcnZpY2Ugd3MsIElXZWJTZXJ2aWNlUHJvamVjdCBwcmVmZmVyZWQsIFN0cmluZyBpbXBsZW1lbnRhdGlvbikKLQl7Ci0JCUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgcmVzb2x2ZWQgPSBudWxsOwotCQlmb3IgKElXZWJTZXJ2aWNlUHJvamVjdCBwcmogOiBnZXREb21CZWluZ0xvYWRlZCgpLmdldFdlYlNlcnZpY2VQcm9qZWN0cygpKQotCQl7Ci0JCQlmb3IgKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Ugc2VpIDogcHJqLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZXMoKSkKLQkJCXsKLQkJCQlpZiAoc2VpLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxlbWVudGF0aW9uKSkKLQkJCQl7Ci0JCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQlpZiAocHJlZmZlcmVkLmVxdWFscyhwcmopKQotCQkJCQl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlCi0JCQkJCXsKLQkJCQkJCXJlc29sdmVkID0gc2VpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdXRpbCgpLnNldEZlYXR1cmVWYWx1ZSh3cywgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsIHJlc29sdmVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NjRjMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JRW5kcG9pbnRNZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnByb3ZpZGVyOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI7DQotDQotLyoqDQotICogUmVwcmVzZW50cyBtZXRhZGF0YSBmb3IgYW4gZW5kcG9pbnQuIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuYW1lIGFuZCBuYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50LiBDb250YWlucyBleHBvc2VkIG9wZXJhdGlvbnMuIFRoaXMgaW50ZXJmYWNlDQotICogaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBpbnB1dCBkYXRhIGZvciBpbXBsZW1lbnRvcnMgb2Yge0BsaW5rIElFbmRwb2ludEdlbmVyYXRvcn0uDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJRW5kcG9pbnRNZXRhZGF0YQ0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgZW5wb2ludC4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBUaGUgcGFja2FnZS9uYW1lc3BhY2Ugb2YgdGhlIGVuZHBvaW50Lg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHJlcHJlc2VudGluZyB0aGlzIGVuZHBvaW50DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnNlcnZpY2UgcmVwcmVzZW50aW5nIHRoaXMgZW5kcG9pbnQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2VydmljZU5hbWUNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VOYW1lKFN0cmluZyBzZXJ2aWNlTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnBvcnQgcmVmZXJlbmNpbmcgdGhpcyBlbmRwb2ludCB3aGljaCB0aGlzDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSB3c2RsOnBvcnQgcmVmZXJlbmNpbmcgdGhpcyBlbmRwb2ludCB3aGljaCB0aGlzDQotCSAqIA0KLQkgKiBAcGFyYW0gcG9ydE5hbWUNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBvcnROYW1lKFN0cmluZyBwb3J0TmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSB3c2RsIGxvY2F0aW9uIGluIGNhc2UgdGhpcyBlbmRwb2ludCBpcyBnZW5lcmF0ZWQgZnJvbSB3c2RsIG90aGVyd2lzZSA8dHQ+bnVsbDwvdHQ+DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdzZGxMb2NhdGlvbigpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd3NkbCBsb2NhdGlvbiBpbiBjYXNlIHRoaXMgZW5kcG9pbnQgaXMgZ2VuZXJhdGVkIGZyb20gd3NkbA0KLQkgKiANCi0JICogQHBhcmFtIHdzZGxMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIGxvY2F0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRXc2RsTG9jYXRpb24oU3RyaW5nIHdzZGxMb2NhdGlvbik7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UgVVJJDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOw0KLQ0KLQkvKioNCi0JICogc2V0cyB0aGUgbmFtZXNwYWNlIFVSSQ0KLQkgKiANCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgY29udGFpbmluZyBXZWJTZXJ2aWNlIG1ldGhvZHMgdGhhdCB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHRoaXMgZW5kcG9pbnQgaW1wbGVtZW50YXRpb24uIFRoaXMNCi0JICogICAgICAgICBtZXRob2QgY2FuIHJldHVybiA8dHQ+bnVsbDwvdHQ+DQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNFSU5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIHJlZmVyZW5jZWQgYnkgdGhpcyBlbmRwb2ludC4NCi0JICogDQotCSAqIEBwYXJhbSBzZWlOYW1lDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8dHQ+c2VpTmFtZTwvdHQ+IGlzIG51bGwNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSA8dHQ+c2VpTmFtZTwvdHQ+IGlzIGVtcHR5IHN0cmluZw0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U0VJTmFtZShTdHJpbmcgc2VpTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBlbmRwb2ludC4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIGxpc3Qgb2YgYWRkZWQgbWV0aG9kcw0KLQkgKi8NCi0JcHVibGljIExpc3Q8SUVuZHBvaW50TWV0aG9kPiBnZXRNZXRob2RzKCk7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIHtAbGluayBJRW5kcG9pbnRNZXRob2R9IHdpdGggPHR0Pm5hbWU8L3R0PiBhbmQgPHR0PnJldHVyblR5cGVGUU5hbWU8L3R0PiBhbmQgYWRkcyBpdCB0byB0aGUgc2V0IG9mIGF2YWlsYWJsZQ0KLQkgKiBtZXRob2RzLg0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUNCi0JICogQHBhcmFtIHJldHVyblR5cGVGUU5hbWUNCi0JICogQHJldHVybiBjcmVhdGVkIElFbmRwb2ludE1ldGhvZCBmb3IgYWRkZWQgbWV0aG9kDQotCSAqLw0KLQlwdWJsaWMgSUVuZHBvaW50TWV0aG9kIGFkZE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nIHJldHVyblR5cGVGUU5hbWUpOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0YWRhdGF9IGRlc2NyaXB0b3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNDb250YWluZXIgLSBDb250YWluZXIsIHdoaWNoIHdpbGwgYmUgYWRkZWQuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvbnNDb250YWluZXIoZmluYWwgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBhbm5vdGF0aW9uc0NvbnRhaW5lcik7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIFNldCB3aXRoIHtAbGluayBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyfSByZWxhdGVkIHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0YWRhdGF9IGRlc2NyaXB0b3IuDQotCSAqDQotCSAqIEByZXR1cm4gU2V0IHdpdGgge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyPiBnZXRBbm5vdGF0aW9uc0NvbnRhaW5lcigpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JRW5kcG9pbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWQyMWNmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3Byb3ZpZGVyL0lFbmRwb2ludE1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucHJvdmlkZXI7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcjsNCi0NCi0vKioNCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW5nIG1ldGhvZCBpbiBlbmRwb2ludC4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGludGVyZmFjZSBJRW5kcG9pbnRNZXRob2QNCi17DQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgbmFtZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSByZXR1cm5GUU5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpOw0KLQ0KLQkvKioNCi0JICogQHBhcmFtIHJldHVyblR5cGVGUU5hbWUNCi0JICogICAgICAgICAgICBzZXRzIHRoZSByZXR1cm4gdHlwZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShTdHJpbmcgcmV0dXJuVHlwZUZRTmFtZSk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIGh1bWFuIHJlYWRhYmxlIG1ldGhvZCByZXByZXNlbnRhdGlvbg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gc2V0IG9mIHRocm93biBleGNlcHRpb25zDQotCSAqLw0KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RXhjZXB0aW9ucygpOw0KLQ0KLQkvKioNCi0JICogQHBhcmFtIGV4Y2VwdGlvbkZRTmFtZQ0KLQkgKiAgICAgICAgICAgIGFkZCB0aHJvd24gZXhjZXB0aW9uIHRvIHRoZSBtZXRob2QNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEV4Y2VwdGlvbihTdHJpbmcgZXhjZXB0aW9uRlFOYW1lKTsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gbGlzdCBvZiBtZXRob2QgcGFyYW1zIG9uIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiBtZXRob2QNCi0JICovDQotCXB1YmxpYyBMaXN0PElNZXRob2RQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKTsNCi0NCi0JLyoqDQotCSAqIGNyZWF0ZXMgbmV3IHBhcmFtIGFucyBhZGRzIGl0IHRvIHRoZSBlbmQgb2YgcGFyYW1ldGVycyBsaXN0Lg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgZnVsbHkgcXVhbGlmaWVkIHR5cGUgbmFtZQ0KLQkgKiBAcGFyYW0gbmFtZSBwYXJhbWV0ZXIgbmFtZQ0KLQkgKiBAcmV0dXJuIHtAbGluayBJTWV0aG9kUGFyYW1ldGVyfSBjcmVhdGVzDQotCSAqLw0KLQlwdWJsaWMgSU1ldGhvZFBhcmFtZXRlciBhZGRQYXJhbWV0ZXIoU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lKTsNCi0NCi0JLyoqDQotCSAqIEFkZHMge0BsaW5rIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJ9IHRvIHRoZSB7QGxpbmsgSUVuZHBvaW50TWV0aG9kfSBkZXNjcmlwdG9yLg0KLQkgKiANCi0JICogQHBhcmFtIGFubm90YXRpb25zQ29udGFpbmVyIC0gQ29udGFpbmVyLCB3aGljaCB3aWxsIGJlIGFkZGVkLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb25zQ29udGFpbmVyKGZpbmFsIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgYW5ub3RhdGlvbnNDb250YWluZXIpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0gcmVsYXRlZCB0byB0aGUge0BsaW5rIElFbmRwb2ludE1ldGhvZH0gZGVzY3JpcHRvci4NCi0JICoNCi0JICogQHJldHVybiBTZXQgd2l0aCB7QGxpbmsgSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcn0uDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI+IGdldEFubm90YXRpb25zQ29udGFpbmVyKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcHJvdmlkZXIvSU1ldGhvZFBhcmFtZXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlNzNlNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9wcm92aWRlci9JTWV0aG9kUGFyYW1ldGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wcm92aWRlcjsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHBhcmFtZXRlciBpbiBtZXRob2QNCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICogDQotICovDQotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUGFyYW1ldGVyDQotew0KLQkvKioNCi0JICogQHJldHVybiB0aGUgcGFyYW1ldGVyIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOw0KLQ0KLQkvKioNCi0JICogQHJldHVybiBwYXJhbWV0ZXIgZnVsbHkgcXVhbGlmaWVkIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3JlZ2lzdHJ5L0lXc0RPTVJ1bnRpbWVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFmOGNiMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9JV3NET01SdW50aW1lSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucmVnaXN0cnk7DQotDQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5JTmFtZWRFeHRlbnNpb25JbmZvOw0KLQ0KLS8qKg0KLSAqIERlZmluZXMgdGhlIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB3aGljaCBzaG91bGQgYmUgaW5zdGFudGlhdGVkIHVwb24gcmVhZGluZyBjb250cmlidXRvcnMNCi0gKiB0byB0aGUgU3VwcG9ydGVkIFJ1bnRpbWUgZXh0ZW5zaW9uIHBvaW50Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIEhyaXN0b3YgSTAzNjIwMQ0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJV3NET01SdW50aW1lSW5mbyBleHRlbmRzIElOYW1lZEV4dGVuc2lvbkluZm8NCi17DQotCS8qKg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgbWFwIG9mIHByb2plY3QgZmFjZXRzIHJlbGV2YW50IGZvciBhIHBhcnRpY3VsYXIgcnVudGltZSB3aGVyZSB0aGUga2V5IGlzIA0KLQkgKiB0aGUgcHJvamVjdCBmYWNldCBpZCBhbmQgdGhlIHZhbHVlIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGZhY2V0IGlmIHNwZWNpZmllZC4NCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb2plY3RGYWNldHMoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS9yZWdpc3RyeS9Xc0RPTVJ1bnRpbWVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MmE4MmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvcmVnaXN0cnkvV3NET01SdW50aW1lUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5yZWdpc3RyeTsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXc0RPTVJ1bnRpbWVFeHRlbnNpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5pbnRlcm5hbC5wbHVnaW4uSmF4V3NEb21SdW50aW1lUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuaW50ZXJuYWwudXRpbC5OYW1lZEV4dGVuc2lvbkluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi0NCi0vKioNCi0gKiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBIcmlzdG92IEkwMzYyMDENCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBXc0RPTVJ1bnRpbWVSZWdpc3RyeSANCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJ1bnRpbWVJbmZvIGV4dGVuZHMgTmFtZWRFeHRlbnNpb25JbmZvIGltcGxlbWVudHMgSVdzRE9NUnVudGltZUluZm8NCi0Jew0KLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2plY3RGYWNldHM7DQotCQkNCi0JCVJ1bnRpbWVJbmZvKGZpbmFsIFN0cmluZyBwSWQsIGZpbmFsIFN0cmluZyBwTGFiZWwsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvamVjdEZhY2V0cykNCi0JCXsNCi0JCQlzdXBlcihwSWQsIHBMYWJlbCk7DQotCQkJDQotCQkJdGhpcy5wcm9qZWN0RmFjZXRzID0gcHJvamVjdEZhY2V0czsNCi0JCX0NCi0JCQ0KLQkJcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRQcm9qZWN0RmFjZXRzKCkNCi0JCXsNCi0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0RmFjZXRzOw0KLQkJfQ0KLSAJfQ0KLQkNCi0JLyoqIFRoZSBJRCBvZiB0aGUgZXh0ZW5zaW9uIHBvaW50IGZvciBhIHN1cHBvcnRlZCBydW50aW1lICovDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1hQID0gSmF4V3NEb21SdW50aW1lUGx1Z2luLlBMVUdJTl9JRCArICIuZG9tcnVudGltZXMiOyAvLyROT04tTkxTLTEkDQotDQotCS8qKgkgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBleHRlbnNpb24gcG9pbnQgbm90IHByb3Blcmx5IGRlZmluZWQgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEID0gIlJlZ2lzdGVyZWQgcnVudGltZSBleHRlbnNpb24gbm90IHByb3Blcmx5IHJlZ2lzdGVyZWQgKGVycm9yIGluIHBsdWdpbi54bWwpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVCA9ICJpbXBsZW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfRUxFTUVOVCA9ICJwcm9qZWN0X2ZhY2V0IjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhQX1BST0pFQ1RfRkFDRVRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfUFJPSkVDVF9GQUNFVF9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgcnVudGltZSBleHRlbnNpb24gaW1wbGVtZW50YXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVdzRE9NUnVudGltZUV4dGVuc2lvbiBpbnN0YW50aWF0ZVJ1bnRpbWUoZmluYWwgSVdzRE9NUnVudGltZUluZm8gaW5mbykNCi0Jew0KLQkJZmluYWwgSUV4dGVuc2lvbiBleHQgPSBmaW5kRXh0ZW5zaW9uKGluZm8pOw0KLQkJDQotCQlpZihleHQ9PW51bGwpDQotCQl7DQotCQkJbG9nZ2VyKCkubG9nRXJyb3IoRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQkNCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsIDogZXh0LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKQ0KLQkJew0KLQkJCWlmIChlbC5nZXROYW1lKCkuZXF1YWxzKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlQpKQ0KLQkJCXsNCi0JCQkJdHJ5DQotCQkJCXsNCi0JCQkJCS8vRklYTUUgQ2xhc3NDYXN0RXhjZXB0aW9uIHNob3dpbmcgdXAgaW4gdGhlIGxvZ3MgaW4gdGhlIFdUUCBidWlsZA0KLQkJCQkJT2JqZWN0IGltcGwgPSBlbC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKFhQX0lNUExFTUVOVEFUSU9OX0VMRU1FTlRfQ0xBU1NfQVRUUik7DQotCQkJCQlpZiAoaW1wbCBpbnN0YW5jZW9mIElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIHsNCi0JCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGltcGw7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCXJldHVybiBudWxsOw0KLQkJCQkJfQ0KLS8vCQkJCQlyZXR1cm4gKElXc0RPTVJ1bnRpbWVFeHRlbnNpb24pIGVsLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oWFBfSU1QTEVNRU5UQVRJT05fRUxFTUVOVF9DTEFTU19BVFRSKTsNCi0JCQkJfSANCi0JCQkJY2F0Y2ggKGZpbmFsIENvcmVFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJbG9nZ2VyKCkubG9nRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgZXh0ZW5zaW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCXJldHVybiBudWxsOw0KLQkJCQkJDQotCQkJCX0NCi0vLwkJCQljYXRjaCAoZmluYWwgQ2xhc3NDYXN0RXhjZXB0aW9uIGUpDQotLy8JCQkJew0KLS8vCQkJCQlsb2dnZXIoKS5sb2dFcnJvcigiSW1wbGVtZW50YXRpb24gY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHByb3BlciBpbnRlcmZhY2UiLCBlKTsgLy8kTk9OLU5MUy0xJA0KLS8vCQkJCQlyZXR1cm4gbnVsbDsNCi0vLwkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlsb2dnZXIoKS5sb2dFcnJvcihFWFRFTlNJT05fTk9UX1BST1BFUkxZX1JFR0lTVEVSRUQpOw0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oRVhURU5TSU9OX05PVF9QUk9QRVJMWV9SRUdJU1RFUkVEKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExvY2F0ZXMgdGhlIGV4dGVuc2lvbiBwb2ludCBjb250cmlidXRpb24gZGVmaW5pdGlvbiBmb3IgdGhpcyBwYXJ0aWN1bGFyIHJ1bnRpbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5mbyB0aGUgZGVzY3JpcHRvciBvYmplY3QgYnVpbHQgZHVyaW5nIGV4dGVuc2lvbiBwb2ludCBsb2FkDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgY29udHJpYnV0aW9uIGRlZmluaXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUV4dGVuc2lvbiBmaW5kRXh0ZW5zaW9uKGZpbmFsIElXc0RPTVJ1bnRpbWVJbmZvIGluZm8pDQotCXsNCi0JCWlmKGluZm8hPW51bGwpDQotCQl7DQotCQkJZmluYWwgSUV4dGVuc2lvbltdIGV4dHMgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFJVTlRJTUVfWFApLmdldEV4dGVuc2lvbnMoKTsNCi0JCQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7IGkrKykNCi0JCQl7DQotCQkJCWlmIChleHRzW2ldLmdldFNpbXBsZUlkZW50aWZpZXIoKS5lcXVhbHMoaW5mby5nZXRJZCgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGV4dHNbaV07DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBydW50aW1lcy4NCi0JICogDQotCSAqIEByZXR1cm4gc2V0IG9mIGluZm9ybWF0aW9uIHJlY29yZHMgZm9yIHRoZSByZWdpc3RlcmVkIHJ1bnRpbWVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SVdzRE9NUnVudGltZUluZm8+IGdldFJlZ2lzdGVyZWRSdW50aW1lc0luZm8oKQ0KLQl7DQotCQlmaW5hbCBJRXh0ZW5zaW9uW10gZXh0cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoUlVOVElNRV9YUCkuZ2V0RXh0ZW5zaW9ucygpOw0KLQkJZmluYWwgQ29sbGVjdGlvbjxJV3NET01SdW50aW1lSW5mbz4gcnVudGltZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxJV3NET01SdW50aW1lSW5mbz4oZXh0cy5sZW5ndGgpOw0KLQkJDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBwcm9qZWN0RmFjZXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsNCi0JCQkNCi0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbCA6IGV4dHNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpDQotCQkJew0KLQkJCQlpZiAoZWwuZ2V0TmFtZSgpLmVxdWFscyhYUF9QUk9KRUNUX0ZBQ0VUX0VMRU1FTlQpKQ0KLQkJCQl7DQotCQkJCQlwcm9qZWN0RmFjZXRzLnB1dChlbC5nZXRBdHRyaWJ1dGUoWFBfUFJPSkVDVF9GQUNFVF9JRCksZWwuZ2V0QXR0cmlidXRlKFhQX1BST0pFQ1RfRkFDRVRfVkVSU0lPTikpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJCQ0KLQkJCXJ1bnRpbWVEZXNjcmlwdG9ycy5hZGQobmV3IFJ1bnRpbWVJbmZvKGV4dHNbaV0uZ2V0U2ltcGxlSWRlbnRpZmllcigpLCBleHRzW2ldLmdldExhYmVsKCksIHByb2plY3RGYWNldHMpKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIHJ1bnRpbWVEZXNjcmlwdG9yczsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJ1bnRpbWUgZGVzY3JpcHRvciBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHJ1bnRpbWUgaWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcnVudGltZUlkIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBydW50aW1lDQotCSAqIEByZXR1cm4gZGVzY3JpcHRvciBvYmplY3QgZm9yIHRoZSBuZWVkZWQgcnVudGltZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJV3NET01SdW50aW1lSW5mbyBnZXRSdW50aW1lSW5mbyhmaW5hbCBTdHJpbmcgcnVudGltZUlkKQ0KLQl7DQotCQlJdGVyYXRvcjxJV3NET01SdW50aW1lSW5mbz4gcmVnaXN0ZXJlZFJ1bnRpbWUgPSBnZXRSZWdpc3RlcmVkUnVudGltZXNJbmZvKCkuaXRlcmF0b3IoKTsNCi0JCQ0KLQkJd2hpbGUocmVnaXN0ZXJlZFJ1bnRpbWUuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlXc0RPTVJ1bnRpbWVJbmZvIHJ1bnRpbWVJbmZvID0gcmVnaXN0ZXJlZFJ1bnRpbWUubmV4dCgpOw0KLQkJCQ0KLQkJCWlmKHJ1bnRpbWVJbmZvLmdldElkKCkuZXF1YWxzKHJ1bnRpbWVJZCkpDQotCQkJew0KLQkJCQlyZXR1cm4gcnVudGltZUluZm87DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvdXRpbC9Eb20yUmVzb3VyY2VNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmVmMjUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tMlJlc291cmNlTWFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLkRvbVV0aWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi0NCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IHRha2VzIGNhcmUgZm9yIG1hcHBpbmcgRE9NIG9iamVjdHMgdG8gRWNsaXBzZSByZXNvdXJjZXMuIA0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tMlJlc291cmNlTWFwcGVyDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvbTJSZXNvdXJjZU1hcHBlciBJTlNUQU5DRSA9IG5ldyBEb20yUmVzb3VyY2VNYXBwZXIoKTsNCi0JDQotCXByaXZhdGUgRG9tU3dpdGNoPFN0cmluZz4gaW1wbENsYXNzRmluZGVyU3dpdGNoOw0KLQkNCi0JLyoqDQotCSAqIFNpbmdsZXRvbiBDb25zdHJ1Y3RvciANCi0JICovDQotCXByaXZhdGUgRG9tMlJlc291cmNlTWFwcGVyKCkgewkNCi0JCXRoaXMuaW1wbENsYXNzRmluZGVyU3dpdGNoID0gY3JlYXRlSW1wbEZpbmRlclN3aXRjaCgpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgdW5kZXJseWluZyB7QGxpbmsgSVJlc291cmNlfSBmb3IgdGhpcyBET00gb2JqZWN0DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZU9iamVjdCk7DQotCQlzd2l0Y2ggKGVPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIA0KLQkJew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRToNCi0JCWNhc2UgRG9tUGFja2FnZS5JU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6IA0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOiANCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNOgkNCi0JCQlmaW5hbCBJVHlwZSB0eXBlID0gZmluZFR5cGUoZU9iamVjdCk7IA0KLQkJCXJldHVybiB0eXBlPT1udWxsID8gbnVsbCA6IHR5cGUuZ2V0UmVzb3VyY2UoKTsNCi0JCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVDoNCi0JCQlyZXR1cm4gZmluZFByb2plY3QoKElXZWJTZXJ2aWNlUHJvamVjdCllT2JqZWN0KTsNCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgSVByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSB3ZWIgc2VydmljZSBwcm9qZWN0IHJlcHJlc2VudGVkIGJ5IDxjb2RlPndzUHJvamVjdDwvY29kZT4NCi0JICogQHBhcmFtIHdzUHJvamVjdCB0aGUgcHJvamVjdCBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gZm91bmQgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBJUHJvamVjdCBmaW5kUHJvamVjdChmaW5hbCBJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0KQ0KLQl7DQotCQlpZiAod3NQcm9qZWN0ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3Qod3NQcm9qZWN0LmdldE5hbWUoKSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBGaW5kcyB1bmRlcmx5aW5nIHtAbGluayBJVHlwZX0gaW5zdGFuY2UgZm9yIHRoaXMgPGNvZGU+ZU9iamVjdDwvY29kZT4gDQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBET00gb2JqZWN0DQotCSAqIEByZXR1cm4gdGhlIElUeXBlIGNvbnRhaW5pbmcgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIElUeXBlIGZpbmRUeXBlKGZpbmFsIEVPYmplY3QgZU9iamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiANCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGVPYmplY3QpOw0KLQkJDQotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoRG9tVXRpbC5JTlNUQU5DRS5maW5kV3NQcm9qZWN0KGVPYmplY3QpKTsNCi0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsNCi0JCWZpbmFsIFN0cmluZyBmcU5hbWUgPSBpbXBsQ2xhc3NGaW5kZXJTd2l0Y2guZG9Td2l0Y2goZU9iamVjdCk7DQotCQlpZiAoamF2YVByb2plY3Q9PW51bGwgfHwgZnFOYW1lID09IG51bGwpIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZxTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBEb21Td2l0Y2g8U3RyaW5nPiBjcmVhdGVJbXBsRmluZGVyU3dpdGNoKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBEb21Td2l0Y2g8U3RyaW5nPigpDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIFN0cmluZyBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugd3MpIHsNCi0JCQkJcmV0dXJuIHdzLmdldEltcGxlbWVudGF0aW9uKCk7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyBTdHJpbmcgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBzZWkpIHsNCi0JCQkJcmV0dXJuIHNlaSA9PSBudWxsID8gbnVsbCA6IHNlaS5nZXRJbXBsZW1lbnRhdGlvbigpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViTWV0aG9kKElXZWJNZXRob2Qgd20pIHsNCi0JCQkJcmV0dXJuIHdtID09IG51bGwgPyBudWxsIDogY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHdtLmVDb250YWluZXIoKSk7DQotCQkJfQkNCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgU3RyaW5nIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIHdwKSB7DQotCQkJCXJldHVybiBjYXNlSVdlYk1ldGhvZCgoSVdlYk1ldGhvZCl3cC5lQ29udGFpbmVyKCkpOw0KLQkJCX0NCi0JCX07DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiNTNjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS51dGlsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLQ0KLQ0KLS8qKg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4NCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZQ0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRG9tQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgew0KLQkvKioNCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIHN0YXRpYyBEb21QYWNrYWdlIG1vZGVsUGFja2FnZTsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21BZGFwdGVyRmFjdG9yeSgpIHsNCi0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkNCi0JCXsNCi0JCQltb2RlbFBhY2thZ2UgPSBEb21QYWNrYWdlLmVJTlNUQU5DRTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Lg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQ0KLQkJew0KLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIERvbVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9DQotCQluZXcgRG9tU3dpdGNoPEFkYXB0ZXI+KCkNCi0JCXsNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSURPTShJRE9NIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJRE9NQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChJSmF2YVdlYlNlcnZpY2VFbGVtZW50IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYk1ldGhvZChJV2ViTWV0aG9kIG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlBhcmFtKElXZWJQYXJhbSBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2UoSVdlYlNlcnZpY2Ugb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KElXZWJTZXJ2aWNlUHJvamVjdCBvYmplY3QpDQotCQkJew0KLQkJCQlyZXR1cm4gY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBjYXNlSVdlYlR5cGUoSVdlYlR5cGUgb2JqZWN0KQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGNyZWF0ZUlXZWJUeXBlQWRhcHRlcigpOw0KLQkJCX0NCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkNCi0JCQl7DQotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOw0KLQkJCX0NCi0JCX07DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0Lg0KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7DQotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET00gPGVtPklET008L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlET01BZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50IDxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJSmF2YVdlYlNlcnZpY2VFbGVtZW50QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZQ0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZCA8ZW0+SVdlYiBNZXRob2Q8L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJNZXRob2RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0gPGVtPklXZWIgUGFyYW08L2VtPn0nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7DQotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5Lg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW0NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlBhcmFtQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UgPGVtPklXZWIgU2VydmljZTwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0IDxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+fScuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsNCi0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4NCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdA0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZSA8ZW0+SVdlYiBUeXBlPC9lbT59Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOw0KLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGUNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYlR5cGVBZGFwdGVyKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKSANCi0Jew0KLQkJc3luY2hyb25pemVkICh0YXJnZXQpIHsNCi0JCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsNCi0JCX0NCi0JfQ0KLQkNCi19IC8vRG9tQWRhcHRlckZhY3RvcnkNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvRG9tU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5NTIxNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0RvbVN3aXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZTsNCi0NCi0NCi0vKioNCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuDQotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQ0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwNCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdA0KLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkNCi0gKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwNCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guDQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQHNlZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2UNCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbVN3aXRjaDxUPiB7DQotCS8qKg0KLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBzdGF0aWMgRG9tUGFja2FnZSBtb2RlbFBhY2thZ2U7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tU3dpdGNoKCkgew0KLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKQ0KLQkJew0KLQkJCW1vZGVsUGFja2FnZSA9IERvbVBhY2thZ2UuZUlOU1RBTkNFOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgew0KLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKQ0KLQkJew0KLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOw0KLQkJCXJldHVybg0KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPw0KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOg0KLQkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsNCi0JCXN3aXRjaCAoY2xhc3NpZmllcklEKQ0KLQkJew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NOg0KLQkJCXsNCi0JCQkJSURPTSBpZG9tID0gKElET00pdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSURPTShpZG9tKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlQ6DQotCQkJew0KLQkJCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50IGlKYXZhV2ViU2VydmljZUVsZW1lbnQgPSAoSUphdmFXZWJTZXJ2aWNlRWxlbWVudCl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlKYXZhV2ViU2VydmljZUVsZW1lbnQpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOg0KLQkJCXsNCi0JCQkJSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlID0gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZShpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfTUVUSE9EOg0KLQkJCXsNCi0JCQkJSVdlYk1ldGhvZCBpV2ViTWV0aG9kID0gKElXZWJNZXRob2QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYk1ldGhvZChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViTWV0aG9kKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU06DQotCQkJew0KLQkJCQlJV2ViUGFyYW0gaVdlYlBhcmFtID0gKElXZWJQYXJhbSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViUGFyYW0oaVdlYlBhcmFtKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSUphdmFXZWJTZXJ2aWNlRWxlbWVudChpV2ViUGFyYW0pOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2UgaVdlYlNlcnZpY2UgPSAoSVdlYlNlcnZpY2UpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2UoaVdlYlNlcnZpY2UpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KGlXZWJTZXJ2aWNlKTsNCi0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9QUk9KRUNUOg0KLQkJCXsNCi0JCQkJSVdlYlNlcnZpY2VQcm9qZWN0IGlXZWJTZXJ2aWNlUHJvamVjdCA9IChJV2ViU2VydmljZVByb2plY3QpdGhlRU9iamVjdDsNCi0JCQkJVCByZXN1bHQgPSBjYXNlSVdlYlNlcnZpY2VQcm9qZWN0KGlXZWJTZXJ2aWNlUHJvamVjdCk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1RZUEU6DQotCQkJew0KLQkJCQlJV2ViVHlwZSBpV2ViVHlwZSA9IChJV2ViVHlwZSl0aGVFT2JqZWN0Ow0KLQkJCQlUIHJlc3VsdCA9IGNhc2VJV2ViVHlwZShpV2ViVHlwZSk7DQotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUlKYXZhV2ViU2VydmljZUVsZW1lbnQoaVdlYlR5cGUpOw0KLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0NCi0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklET008L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLg0KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JRE9NPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlET00oSURPTSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JSmF2YSBXZWIgU2VydmljZSBFbGVtZW50PC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SUphdmEgV2ViIFNlcnZpY2UgRWxlbWVudDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJSmF2YVdlYlNlcnZpY2VFbGVtZW50KElKYXZhV2ViU2VydmljZUVsZW1lbnQgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIE1ldGhvZDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgTWV0aG9kPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJNZXRob2QoSVdlYk1ldGhvZCBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFBhcmFtPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBQYXJhbTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViUGFyYW0oSVdlYlBhcmFtIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZTwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGNhc2VJV2ViU2VydmljZShJV2ViU2VydmljZSBvYmplY3QpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JV2ViIFNlcnZpY2UgUHJvamVjdDwvZW0+Jy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7DQotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPklXZWIgU2VydmljZSBQcm9qZWN0PC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJTZXJ2aWNlUHJvamVjdChJV2ViU2VydmljZVByb2plY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsNCi0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SVdlYiBUeXBlPC9lbT4nLg0KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkNCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIFQgY2FzZUlXZWJUeXBlKElXZWJUeXBlIG9iamVjdCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOw0KLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuDQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4NCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4NCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpDQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0gLy9Eb21Td2l0Y2gNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvSmVlNURvbVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0NTVkNzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL0plZTVEb21VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXMuV1BfQU5OT1RBVElPTjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLlNPQVBCaW5kaW5nU3R5bGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuV2ViUGFyYW1LaW5kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuV1BBbm5vdGF0aW9uRmVhdHVyZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9uLkFubm90YXRpb25BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLmFubm90YXRpb24uSUFubm90YXRpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotDQotLyoqDQotICogVXRpbGl0eSBmb3Igc29tZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmljIGxvZ2ljcyB0aGF0IGFyZSBmcmVxdWVudGx5IHVzZWQNCi0gKiB3aGlsZSBkZWFsaW5nIHdpdGggRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKZWU1RG9tVXRpbHMgDQotew0KLQkvKiogdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSAqLw0KLQlwcml2YXRlIHN0YXRpYyBKZWU1RG9tVXRpbHMgaW5zdGFuY2U7DQotCQ0KLQlwcml2YXRlIEplZTVEb21VdGlscygpIHsNCi0JCS8vIHNpbmdsZXRvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgYXR0cmlidXRlICdwYXJ0TmFtZScgaXMgdXNlZCBhdCBhbGwgYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ3BhcnROYW1lJyBjb2x1bW4gJ21lYW5pbmcnLg0KLQkgKiBAcGFyYW0gd2ViUGFyYW0gdGhlIHdlYlBhcmFtIHRvIGJlIGNoZWNrZWQNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbiBjYXNlIHBhcnROYW1lIGlzIHVzZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGFydE5hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCXJldHVybiB3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLlJQQyB8fCANCi0JCQl3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZSgpPT1TT0FQQmluZGluZ1BhcmFtZXRlclN0eWxlLkJBUkU7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBNZXRob2QgdGhhdCBkZWNpZGVzIGlzIHRoZSBhdHRyaWJ1dGUgJ25hbWUnIGlzIHVzZWQgYXQgYWxsDQotCSAqIGFjY29yZGluZyB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycNCi0JICogQHBhcmFtIHdlYlBhcmFtDQotCSAqIEByZXR1cm4gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGluIGNhc2UgbmFtZSBpcyB1c2VkDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc05hbWVVc2VkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQlpZiggd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nU3R5bGUoKT09U09BUEJpbmRpbmdTdHlsZS5ET0NVTUVOVCB8fCB3ZWJQYXJhbS5pc0hlYWRlcigpICkgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJDQotCQlmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gIGZpbmRBbm5vdGF0aW9uKHdlYlBhcmFtLCBXUF9BTk5PVEFUSU9OKTsNCi0JCWlmIChhbm5vdGF0aW9uPT1udWxsKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKFdQQW5ub3RhdGlvbkZlYXR1cmVzLlBBUlRfTkFNRV9BVFRSSUJVVEUpPT1udWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogSGVscGVyIG1ldGhvZCB0byBleHRyYWN0IGFubm90YXRpb24gd2l0aCBmdWxseSBxdWFsaWZpZWQgbmFtZSA8Y29kZT5hbm5GUU5hbWU8L2NvZGU+DQotCSAqIEBwYXJhbSBlT2JqZWN0IHRoZSBvYmplY3QgdG8gc2VhcmNoIGluDQotCSAqIEBwYXJhbSBhbm5GUU5hbWUgdGhlIEZRIG5hbWUgb2Ygc2VhcmNoZWQgYW5ub3RhdGlvbiANCi0JICogQHJldHVybiBmb3VuZCBhbm5vdGF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gZmluZEFubm90YXRpb24oZmluYWwgRU9iamVjdCBlT2JqZWN0LCBmaW5hbCBTdHJpbmcgYW5uRlFOYW1lKSANCi0Jew0KLQkJZmluYWwgSUFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSUFubm90YXRpb25BZGFwdGVyKUFubm90YXRpb25BZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChlT2JqZWN0LCBJQW5ub3RhdGlvbkFkYXB0ZXIuY2xhc3MpOw0KLQkJaWYgKGFkYXB0ZXIhPW51bGwpIHsNCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRBbm5vdGF0aW9uKGFubkZRTmFtZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRoYXQgZGVjaWRlcyBpZiB0aGUgcGFyYW0gbmFtZSBpcyByZXF1aXJlZCB0byBiZSBwdXQgaW4gdGhlIGFubm90YXRpb24gYWNjb3JkaW5nIA0KLQkgKiB0byBKU1ItMTgxIHNlY3Rpb24gNC40LjEgLSBhdHRyaWJ1dGUgJ25hbWUnIGNvbHVtbiAnbWVhbmluZycuDQotCSAqIEBwYXJhbSB3ZWJQYXJhbQ0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuYW1lIGF0dHJpYnV0ZSBzaG91bGQgYmUgcHV0IG9uIGFubm90YXRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzTmFtZVJlcXVpcmVkKGZpbmFsIElXZWJQYXJhbSB3ZWJQYXJhbSkNCi0Jew0KLQkJZmluYWwgSVdlYk1ldGhvZCB3ZWJNZXRob2QgPSAoSVdlYk1ldGhvZCl3ZWJQYXJhbS5lQ29udGFpbmVyKCk7DQotCQkNCi0JCWlmICh3ZWJNZXRob2QuZ2V0U29hcEJpbmRpbmdTdHlsZSgpPT1TT0FQQmluZGluZ1N0eWxlLkRPQ1VNRU5UICYmDQotCQkJd2ViTWV0aG9kLmdldFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGUoKT09U09BUEJpbmRpbmdQYXJhbWV0ZXJTdHlsZS5CQVJFICYmDQotCQkJKHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLklOT1VUIHx8IHdlYlBhcmFtLmdldEtpbmQoKT09V2ViUGFyYW1LaW5kLk9VVCkpIHsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9CQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBKZWU1RG9tVXRpbHMgZ2V0SW5zdGFuY2UoKQ0KLQl7DQotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgew0KLQkJCWluc3RhbmNlID0gbmV3IEplZTVEb21VdGlscygpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gaW5zdGFuY2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vcnVudGltZS91dGlsL1BhcmFtVmFsdWVDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGU3NzI0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9ydW50aW1lL3V0aWwvUGFyYW1WYWx1ZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnV0aWw7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGNvbXBhcmVzIHtAbGluayBJUGFyYW1WYWx1ZVBhaXJ9IGJ5IHByb3BlcnR5IG5hbWUuIEludGVuZGVkIHRvIGJlIHVzZWQgd2hlbiANCi0gKiBjcmVhdGluZyBhIHtAbGluayBUcmVlU2V0fSBmb3IgYW5ub3RhdGlvbiBwcm9wZXJ0aWVzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPElQYXJhbVZhbHVlUGFpcj4NCi17CQkNCi0JcHVibGljIGVudW0gT3JkZXIge05vcm1hbCwgUmV2ZXJzZWR9Ow0KLQ0KLQlwcml2YXRlIGZpbmFsIE9yZGVyIG9yZGVyOw0KLQkNCi0JcHVibGljIFBhcmFtVmFsdWVDb21wYXJhdG9yKCkgew0KLQkJb3JkZXIgPSBPcmRlci5Ob3JtYWw7DQotCX0NCi0JDQotCXB1YmxpYyBQYXJhbVZhbHVlQ29tcGFyYXRvcihmaW5hbCBPcmRlciBvcmRlcikgew0KLQkJdGhpcy5vcmRlciA9IG9yZGVyOw0KLQl9DQotDQotCQ0KLQlwdWJsaWMgaW50IGNvbXBhcmUoSVBhcmFtVmFsdWVQYWlyIG8xLCBJUGFyYW1WYWx1ZVBhaXIgbzIpIA0KLQl7DQotCQlpZihvcmRlcj09T3JkZXIuTm9ybWFsKSB7DQotCQkJcmV0dXJuIG8xLmdldFBhcmFtKCkuY29tcGFyZVRvKG8yLmdldFBhcmFtKCkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbzIuZ2V0UGFyYW0oKS5jb21wYXJlVG8obzEuZ2V0UGFyYW0oKSk7DQotCX0JCQ0KLX0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Nzg0YWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwYmIyYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBKdW4gMjMgMTA6Mzg6MjIgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhYTYyM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpJEltcGxlbWVudGF0aW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLAotIG9yZy5lY2xpcHNlLmpmYWNlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMTUsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDE4NGVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLWJpbi5pbmNsdWRlcyA9IC4sXA0KLSAgICAgICAgICAgICAgIGljb25zLyxcDQotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbA0KLWphcnMuY29tcGlsZS5vcmRlciA9IC4NCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTMyNWNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9TRUkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1NFSV9Hcm91cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJX0dyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWFmY2MwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvU0VJX0dyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfTWV0aG9kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfTWV0aG9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgxOGEzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX01ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1BhcmFtX0luLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fSW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZTZiMzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fSW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9PdXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9QYXJhbV9PdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZDA5MThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfUGFyYW1fT3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MjE2YjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfR3JvdXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0dyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGI0ODE0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvV2ViX1NlcnZpY2VfR3JvdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9XZWJfU2VydmljZV9JdGVtX1Byb3ZpZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9lcnJvcl9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Vycm9yX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBiYzYwNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Vycm9yX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlET01fd2ViU2VydmljZVByb2plY3RzX0lXZWJTZXJ2aWNlUHJvamVjdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlET01fd2ViU2VydmljZVByb2plY3RzX0lXZWJTZXJ2aWNlUHJvamVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjNzY2NzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJRE9NX3dlYlNlcnZpY2VQcm9qZWN0c19JV2ViU2VydmljZVByb2plY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3dlYk1ldGhvZHNfSVdlYk1ldGhvZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19JV2ViTWV0aG9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTVmNWE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19JV2ViTWV0aG9kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX0lXZWJQYXJhbS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJNZXRob2RfcGFyYW1ldGVyc19JV2ViUGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwM2Q2M2NiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX0lXZWJQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzYxYjE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUlXZWJTZXJ2aWNlUHJvamVjdF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfSVdlYlNlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfSVdlYlNlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MTIwZDEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0X3dlYlNlcnZpY2VzX0lXZWJTZXJ2aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lET00uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSURPTS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQyMGVlZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSURPTS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lKYXZhV2ViU2VydmljZUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTU4YTY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lKYXZhV2ViU2VydmljZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzNhOTk3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJNZXRob2QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYk1ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExN2RjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYk1ldGhvZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViUGFyYW0uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlBhcmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGE1YzcwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViUGFyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlNlcnZpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MzUwMGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlUHJvamVjdC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViU2VydmljZVByb2plY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OTgzNjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy9mdWxsL29iajE2L0lXZWJTZXJ2aWNlUHJvamVjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViVHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvaWNvbnMvZnVsbC9vYmoxNi9JV2ViVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL2Z1bGwvb2JqMTYvSVdlYlR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL3dhcm5pbmdfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9pY29ucy93YXJuaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiMmU1MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL2ljb25zL3dhcm5pbmdfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2FhM2I3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLSMgVG8gY29kZSBkZXZlbG9wZXI6DQotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQ0KLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLg0KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UNCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuDQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQ0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi1CdW5kbGUtTmFtZS4wPUpBWC1XUyBET00gVUkgUGx1Zy1pbiAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQ0KLV9VSV9DcmVhdGVDaGlsZF90ZXh0MiA9IHsxfSB7MH0NCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dDMgPSB7MX0NCi1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlDQotX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uID0gQ3JlYXRlIGEgbmV3IGNoaWxkIG9mIHR5cGUgezB9IGZvciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlIHNlbGVjdGVkIHsyfS4NCi1fVUlfQ3JlYXRlU2libGluZ19kZXNjcmlwdGlvbiA9IENyZWF0ZSBhIG5ldyBzaWJsaW5nIG9mIHR5cGUgezB9IGZvciB0aGUgc2VsZWN0ZWQgezJ9LCB1bmRlciB0aGUgezF9IGZlYXR1cmUgb2YgdGhlaXIgcGFyZW50Lg0KLQ0KLV9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24gPSBUaGUgezB9IG9mIHRoZSB7MX0NCi0NCi1fVUlfSURPTV90eXBlID0gSURPTQ0KLV9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUgPSBKYXZhIFdlYiBTZXJ2aWNlIEVsZW1lbnQNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlID0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UNCi1fVUlfSVdlYlNlcnZpY2VfdHlwZSA9IFdlYiBTZXJ2aWNlDQotX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlID0gV2ViIFNlcnZpY2UgUHJvamVjdA0KLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QNCi0NCi1fVUlfVW5rbm93bl9kYXRhdHlwZT0gVmFsdWUNCi0NCi1fVUlfSURPTV93ZWJTZXJ2aWNlUHJvamVjdHNfZmVhdHVyZSA9IFdlYiBTZXJ2aWNlIFByb2plY3RzDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfamF2YUltcGxlbWVudGF0aW9uX2ZlYXR1cmUgPSBKYXZhIEltcGxlbWVudGF0aW9uDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxpY2l0X2ZlYXR1cmUgPSBJbXBsaWNpdA0KLV9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ltcGxlbWVudGluZ1dlYlNlcnZpY2VzX2ZlYXR1cmUgPSBJbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmcgPSBTT0FQIEJpbmRpbmcNCi1fVUlfSVdlYlNlcnZpY2VfbmFtZV9mZWF0dXJlID0gTmFtZQ0KLV9VSV9JV2ViU2VydmljZV9zZXJ2aWNlRW5kcG9pbnRfZmVhdHVyZSA9IFNlcnZpY2UgRW5kcG9pbnQNCi1fVUlfSVdlYlNlcnZpY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUgPSBUYXJnZXQgTmFtZXNwYWNlDQotX1VJX0lXZWJTZXJ2aWNlX3BvcnROYW1lX2ZlYXR1cmUJCT0gUG9ydCBOYW1lDQotX1VJX0lXZWJTZXJ2aWNlX3dzZGxMb2NhdGlvbl9mZWF0dXJlCT0gV1NETCBMb2NhdGlvbg0KLV9VSV9JV2ViU2VydmljZVByb2plY3Rfd2ViU2VydmljZXNfZmVhdHVyZSA9IFdlYiBTZXJ2aWNlcw0KLV9VSV9JV2ViU2VydmljZVByb2plY3Rfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlc19mZWF0dXJlID0gU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzDQotX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF9uYW1lX2ZlYXR1cmUgPSBOYW1lDQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkDQotDQotX1VJX1dlYlNlcnZpY2VBbm5vdGF0aW9uQ2F0ZWdvcnkgPSBHZW5lcmFsIChXZWJTZXJ2aWNlIGFubm90YXRpb24pDQotX1VJX1dlYk1ldGhvZEFubm90YXRpb25DYXRlZ29yeSA9IEdlbmVyYWwgKFdlYk1ldGhvZCBhbm5vdGF0aW9uKQ0KLV9VSV9XZWJQYXJhbUFubm90YXRpb25DYXRlZ29yeSA9IEdlbmVyYWwgKFdlYlBhcmFtIGFubm90YXRpb24pDQotDQotX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfaW1wbGVtZW50YXRpb25fZmVhdHVyZSA9IEphdmEgcmVwcmVzZW50YXRpb24NCi1fVUlfSVdlYk1ldGhvZF90eXBlID0gV2ViIE1ldGhvZA0KLV9VSV9JV2ViUGFyYW1fdHlwZSA9IFdlYiBQYXJhbQ0KLV9VSV9JV2ViVHlwZV90eXBlID0gV2ViIFR5cGUNCi1fVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9uYW1lX2ZlYXR1cmUgPSBOYW1lDQotX1VJX0lXZWJNZXRob2RfZXhjbHVkZWRfZmVhdHVyZSA9IEV4Y2x1ZGVkDQotX1VJX0lXZWJQYXJhbV9raW5kX2ZlYXR1cmUgPSBNb2RlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfd2ViTWV0aG9kc19mZWF0dXJlID0gV2ViIE1ldGhvZHMNCi1fVUlfSVdlYk1ldGhvZF9wYXJhbWV0ZXJzX2ZlYXR1cmUgPSBQYXJhbWV0ZXJzDQotX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlID0gVHlwZSBOYW1lDQotX1VJX0lXZWJQYXJhbV9wYXJ0TmFtZV9mZWF0dXJlID0gUGFydCBOYW1lDQotX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSA9IFRhcmdldCBOYW1lc3BhY2UNCi1fVUlfSVdlYlBhcmFtX2hlYWRlcl9mZWF0dXJlID0gSGVhZGVyDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlID0gU3R5bGUNCi1fVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlID0gVXNlDQotX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlID0gUGFyYW1ldGVyIFN0eWxlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlID0gU3R5bGUNCi1fVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1VzZV9mZWF0dXJlID0gVXNlDQotX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZV9mZWF0dXJlID0gUGFyYW1ldGVyIFN0eWxlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjk0ZDY4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLQ0KLTwhLS0NCi0gICAgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAgIA0KLSAgICBDb250cmlidXRvcnM6DQotICAgICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gLS0+DQotDQotPHBsdWdpbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWRpdC5pdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yaWVzIj4NCi0gICAgICA8ZmFjdG9yeQ0KLSAgICAgICAgICAgIHVyaT0iaHR0cDovLy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3J1bnRpbWUvZG9tLmVjb3JlIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ig0KLSAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzPQ0KLSAgICAgICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyDQotICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIvPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0RvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5MjM1NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0RvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb21BZGFwdGVyRmFjdG9yeTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuDQotICogVGhlIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uDQotICogVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4NCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRG9tQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsNCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7DQotDQotCS8qKg0KLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOw0KLQ0KLQkvKioNCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5IHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsNCi0NCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsNCi0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7DQotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSURPTUl0ZW1Qcm92aWRlciBpZG9tSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSURPTX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSURPTUFkYXB0ZXIoKSB7DQotCQlpZiAoaWRvbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaWRvbUl0ZW1Qcm92aWRlciA9IG5ldyBJRE9NSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlkb21JdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50fSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciBpSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSUphdmFXZWJTZXJ2aWNlRWxlbWVudH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSUphdmFXZWJTZXJ2aWNlRWxlbWVudEFkYXB0ZXIoKSB7DQotCQlpZiAoaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlciA9IG5ldyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKSB7DQotCQlpZiAoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciA9IG5ldyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kfSBpbnN0YW5jZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlciBpV2ViTWV0aG9kSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSVdlYk1ldGhvZEFkYXB0ZXIoKSB7DQotCQlpZiAoaVdlYk1ldGhvZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYk1ldGhvZEl0ZW1Qcm92aWRlciA9IG5ldyBJV2ViTWV0aG9kSXRlbVByb3ZpZGVyKHRoaXMpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGlXZWJNZXRob2RJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW19IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViUGFyYW1JdGVtUHJvdmlkZXIgaVdlYlBhcmFtSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCkgew0KLQkJaWYgKGlXZWJQYXJhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlBhcmFtSXRlbVByb3ZpZGVyID0gbmV3IElXZWJQYXJhbUl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpV2ViUGFyYW1JdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyIGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2V9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJTZXJ2aWNlQWRhcHRlcigpIHsNCi0JCWlmIChpV2ViU2VydmljZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIgPSBuZXcgSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlNlcnZpY2VJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9IGluc3RhbmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByb3RlY3RlZCBJV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0fS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJV2ViU2VydmljZVByb2plY3RBZGFwdGVyKCkgew0KLQkJaWYgKGlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyID0gbmV3IElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcih0aGlzKTsNCi0JCX0NCi0NCi0JCXJldHVybiBpV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViVHlwZX0gaW5zdGFuY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHJvdGVjdGVkIElXZWJUeXBlSXRlbVByb3ZpZGVyIGlXZWJUeXBlSXRlbVByb3ZpZGVyOw0KLQ0KLQkvKioNCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGV9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUlXZWJUeXBlQWRhcHRlcigpIHsNCi0JCWlmIChpV2ViVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7DQotCQkJaVdlYlR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSVdlYlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7DQotCQl9DQotDQotCQlyZXR1cm4gaVdlYlR5cGVJdGVtUHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7DQotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7DQotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgew0KLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7DQotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgew0KLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsNCi0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzPD8+KXR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7DQotCQkJCXJldHVybiBhZGFwdGVyOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7DQotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQ0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsNCi0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGRpc3Bvc2VzIGFsbCBvZiB0aGUgaXRlbSBwcm92aWRlcnMgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkuIA0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChpZG9tSXRlbVByb3ZpZGVyICE9IG51bGwpIGlkb21JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCQlpZiAoaVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViTWV0aG9kSXRlbVByb3ZpZGVyICE9IG51bGwpIGlXZWJNZXRob2RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlXZWJQYXJhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViUGFyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOw0KLQkJaWYgKGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyICE9IG51bGwpIGlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgaVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JCWlmIChpV2ViVHlwZUl0ZW1Qcm92aWRlciAhPSBudWxsKSBpV2ViVHlwZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01JdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JRE9NSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwZTFjZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElET01JdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJRE9NSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJfQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSURPTV9fV0VCX1NFUlZJQ0VfUFJPSkVDVFMpOw0KLQkJfQ0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7DQotCX0NCi0NCi0JLyoqDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7DQotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yDQotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuDQotDQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSURPTS5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSURPTSIpKTsgIC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0lET01fdHlwZSIpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQNCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0NCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJRE9NLmNsYXNzKSkgew0KLQkJCWNhc2UgRG9tUGFja2FnZS5JRE9NX19XRUJfU0VSVklDRV9QUk9KRUNUUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklET01fX1dFQl9TRVJWSUNFX1BST0pFQ1RTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0KCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lET01Qcm9wZXJ0eVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSURPTVByb3BlcnR5VmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzg2MmIwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSURPTVByb3BlcnR5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHByb3BlcnR5IHZhbHVlLiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGlkZW50aWZ5IHByb3BlcnR5IHZhbHVlcyBmb3IgV1MgRE9NIG9iamVjdHMuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTVByb3BlcnR5VmFsdWUgZXh0ZW5kcyBJSXRlbVByb3BlcnR5U291cmNlDQotew0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0ZGJiOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50fSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJCWFkZEltcGxlbWVudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJfQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wbGVtZW50YXRpb24gZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsZW1lbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X25hbWVfZmVhdHVyZSIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFRoaXMgbWV0aG9kIGRlZmluZXMgYXQgd2hpY2ggY2F0ZWdvcnkgdGhlIG5hbWUgc2hvdWxkIGdvIHRvLiBFeHRlbmRlciBvZg0KLQkgKiB0aGlzIGNsYXNzIHNob3VsZCBvdmVycmlkZSBpdCBpZiB3YW50cyB0aGUgbmFtZSB0byBiZSBzZXBhcmF0ZWQgaW4gZGlmZmVyZW50IA0KLQkgKiB0aGFuIGRlZmF1bHQgY2F0ZWdvcnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50LmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JSmF2YVdlYlNlcnZpY2VFbGVtZW50IikpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCVN0cmluZyBsYWJlbCA9ICgoSUphdmFXZWJTZXJ2aWNlRWxlbWVudClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWdldFN0cmluZygiX1VJX0lKYXZhV2ViU2VydmljZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotDQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT046DQotCQkJY2FzZSBEb21QYWNrYWdlLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX05BTUU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmODhiYzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLmltcGwuRE9NSXRlbVByb3BlcnR5UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSANCi0Jew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBudWxsOw0KLQkJDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotDQotCQlhZGRJbXBsaWNpdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkSW1wbGVtZW50aW5nV2ViU2VydmljZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFNvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wbGljaXQgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsaWNpdFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9pbXBsaWNpdF9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19JTVBMSUNJVCwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCi0JCQkJIG51bGwsDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBsZW1lbnRpbmcgV2ViIFNlcnZpY2VzIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wbGVtZW50aW5nV2ViU2VydmljZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGVtZW50aW5nV2ViU2VydmljZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfaW1wbGVtZW50aW5nV2ViU2VydmljZXNfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTEVNRU5USU5HX1dFQl9TRVJWSUNFUywNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSB0cnVlLA0KLQkJCQkgbnVsbCwNCi0JCQkJIG51bGwsDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgTmFtZXNwYWNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3RhcmdldE5hbWVzcGFjZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19UQVJHRVRfTkFNRVNQQUNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgU3R5bGUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwQmluZGluZ1N0eWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nU3R5bGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgQmluZGluZyBVc2UgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwQmluZGluZ1VzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1VzZV9mZWF0dXJlIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfVVNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSIsICJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1BBUkFNRVRFUl9TVFlMRSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Vfc29hcEJpbmRpbmciKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUyk7DQotCQl9DQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCi0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCi0NCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlLmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7DQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKEltYWdlcy5JTUdfU0VJKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upb2JqZWN0KS5nZXROYW1lKCk7DQotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8NCi0JCQlnZXRTdHJpbmcoIl9VSV9JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UuY2xhc3MpKSB7DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fSU1QTElDSVQ6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fVEFSR0VUX05BTUVTUEFDRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfU1RZTEU6DQotCQkJY2FzZSBEb21QYWNrYWdlLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7DQotCQkJCXJldHVybjsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX19XRUJfTUVUSE9EUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklTRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9fV0VCX01FVEhPRFMsDQotCQkJCSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViTWV0aG9kKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlQW5ub3RhdGlvbkNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYk1ldGhvZEl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJNZXRob2RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzgwMDU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYk1ldGhvZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aTsNCi0NCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21QYWNrYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZH0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViTWV0aG9kSXRlbVByb3ZpZGVyIGV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYk1ldGhvZEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgDQotCXsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyAhPSBudWxsKSB7DQotCQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQkJfQ0KLQkJDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotCQkNCi0JCWFkZEV4Y2x1ZGVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRTb2FwQmluZGluZ1N0eWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRTb2FwQmluZGluZ1VzZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJDQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBsZW1lbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSANCi0Jew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKA0KLQkJCW5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKA0KLQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJCSBnZXRTdHJpbmcoIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X2ltcGxlbWVudGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSUphdmFXZWJTZXJ2aWNlRWxlbWVudF9pbXBsZW1lbnRhdGlvbl9mZWF0dXJlIiwgIl9VSV9JSmF2YVdlYlNlcnZpY2VFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklKQVZBX1dFQl9TRVJWSUNFX0VMRU1FTlRfX0lNUExFTUVOVEFUSU9OLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIGZhbHNlLA0KLQkJCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJCSBudWxsLA0KLQkJCQkJIG51bGwpDQotCQkJew0KLQkJCQkNCi0JCQkJQE92ZXJyaWRlIA0KLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkNCi0JCQkJew0KLQkJCQkJU3RyaW5nIHJldHVyblN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCQlTdHJpbmcgcGFyYW1ldGVycyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCQlJV2ViTWV0aG9kIHdlYk1ldGhvZCA9IChJV2ViTWV0aG9kKWdldFRhcmdldCgpOw0KLQkJCQkJCQ0KLQkJCQkJZm9yKElXZWJQYXJhbSB3ZWJQYXJhbSA6IHdlYk1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpDQotCQkJCQl7DQotCQkJCQkJaWYod2ViUGFyYW0uZ2V0TmFtZSgpLmVxdWFscygicmV0dXJuIikpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQl7DQotCQkJCQkJCXJldHVyblN0cmluZyA9IGdldFR5cGVOYW1lKHdlYlBhcmFtLmdldFR5cGVOYW1lKCkpICsgIiAiOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfQ0KLQkJCQkJCWVsc2UNCi0JCQkJCQl7DQotCQkJCQkJCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzICsgZ2V0VHlwZU5hbWUod2ViUGFyYW0uZ2V0VHlwZU5hbWUoKSkgKyAiLCAiOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJCQ0KLQkJCQkJaWYgKHBhcmFtZXRlcnMubGVuZ3RoKCkgPiAwKSB7DQotCQkJCQkJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3Vic3RyaW5nKDAsIHBhcmFtZXRlcnMubGFzdEluZGV4T2YoJywnKSk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCVN0cmluZyBtZXRob2ROYW1lID0gd2ViTWV0aG9kLmdldEltcGxlbWVudGF0aW9uKCk7IA0KLQkJCQkJaW50IHBvcyA9IG1ldGhvZE5hbWUuaW5kZXhPZignKCcpOw0KLQkJCQkJaWYgKHBvcyA+IC0xKSB7DQotCQkJCQkJbWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7DQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCXJldHVybiByZXR1cm5TdHJpbmcgKyBtZXRob2ROYW1lICsgJygnICsgcGFyYW1ldGVycyArICcpJzsNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUpDQotCQkJCXsNCi0JCQkJCXJldHVybiB0eXBlTmFtZS5zdWJzdHJpbmcodHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOw0KLQkJCQl9DQotCQkJfSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGNsdWRlZCBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2x1ZGVkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViTWV0aG9kX2V4Y2x1ZGVkX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fRVhDTFVERUQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvYXAgQmluZGluZyBTdHlsZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBCaW5kaW5nU3R5bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdTdHlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1N0eWxlX2ZlYXR1cmUiLCAiX1VJX0lXZWJNZXRob2RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgVXNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdVc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3INCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJNZXRob2Rfc29hcEJpbmRpbmdVc2VfZmVhdHVyZSIsICJfVUlfSVdlYk1ldGhvZF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfVVNFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEJpbmRpbmcgUGFyYW1ldGVyIFN0eWxlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkU29hcEJpbmRpbmdQYXJhbWV0ZXJTdHlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYk1ldGhvZF9zb2FwQmluZGluZ1BhcmFtZXRlclN0eWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViTWV0aG9kX3NvYXBCaW5kaW5nUGFyYW1ldGVyU3R5bGVfZmVhdHVyZSIsICJfVUlfSVdlYk1ldGhvZF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19TT0FQX0JJTkRJTkdfUEFSQU1FVEVSX1NUWUxFLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZV9zb2FwQmluZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuDQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsNCi0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7DQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUyk7DQotCQl9DQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsNCi0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3INCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4NCi0NCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyBXZWJfTWV0aG9kLmdpZi4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBJbWFnZXMuSU5TVEFOQ0UuZ2V0SW1hZ2UoSW1hZ2VzLklNR19XRUJfTUVUSE9EKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsNCi0JCVN0cmluZyBsYWJlbCA9ICgoSVdlYk1ldGhvZClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJNZXRob2RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkDQotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsNCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7DQotDQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSVdlYk1ldGhvZC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX0VYQ0xVREVEOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1NUWUxFOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fU09BUF9CSU5ESU5HX1VTRToNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9NRVRIT0RfX1NPQVBfQklORElOR19QQVJBTUVURVJfU1RZTEU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX01FVEhPRF9fUEFSQU1FVEVSUzoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfTUVUSE9EX19QQVJBTUVURVJTLA0KLQkJCQkgRG9tRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSVdlYlBhcmFtKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkNCi0Jew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1dlYk1ldGhvZEFubm90YXRpb25DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkDQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViUGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViUGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjA3NWJhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbX0gb2JqZWN0Lg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJV2ViUGFyYW1JdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JDQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgIT0gbnVsbCkgew0KLQkJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JCX0NCi0JCQ0KLQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJYWRkS2luZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkVHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7DQotCQlhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZEhlYWRlclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJDQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLaW5kIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkS2luZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX2tpbmRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV9raW5kX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX0tJTkQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yT2xkKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoDQotCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCQlnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1fdHlwZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90eXBlTmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViUGFyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkJRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsDQotCQkJCQlmYWxzZSwNCi0JCQkJCWZhbHNlLA0KLQkJCQkJZmFsc2UsDQotCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsDQotCQkJCQludWxsLA0KLQkJCQkJbnVsbCkgDQotCQkJew0KLQkJCQlAT3ZlcnJpZGUNCi0JCQkJcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIA0KLQkJCQl7DQotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSBudWxsOw0KLQkJCQkJDQotCQkJCQlmaW5hbCBPYmplY3QgdHlwZVNpZ25hdHVyZSA9IHN1cGVyLmdldFZhbHVlKG9iamVjdCwgZmVhdHVyZSk7DQotCQkJCQlpZiAodHlwZVNpZ25hdHVyZSAhPSBudWxsKQ0KLQkJCQkJewkJCQkJCQ0KLQkJCQkJCXR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHR5cGVTaWduYXR1cmUudG9TdHJpbmcoKSk7CQkJCQkJDQotCQkJCQl9DQotCQkJCQkNCi0JCQkJCXJldHVybiB0eXBlTmFtZTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFydCBOYW1lIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlBhcmFtX3BhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1fcGFydE5hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fUEFSVF9OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXJnZXQgTmFtZXNwYWNlIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0TmFtZXNwYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWZpbmFsIElQcm9wZXJ0eVN0YXRlIHN0YXRlID0gKElQcm9wZXJ0eVN0YXRlKVByb3BlcnR5U3RhdGVBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5hZGFwdChvYmplY3QsIElQcm9wZXJ0eVN0YXRlLmNsYXNzKTsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJQYXJhbV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIsICJfVUlfSVdlYlBhcmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVEFSR0VUX05BTUVTUEFDRSwNCi0JCQkJIChzdGF0ZT09bnVsbCkgPyBmYWxzZSA6IHN0YXRlLmlzQ2hhbmdlYWJsZShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0UpLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVhZGVyIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViUGFyYW1faGVhZGVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViUGFyYW1faGVhZGVyX2ZlYXR1cmUiLCAiX1VJX0lXZWJQYXJhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX0hFQURFUiwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgV2ViX1BhcmFtLmdpZi4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIA0KLQl7DQotCQlTdHJpbmcgaW1hZ2VOYW1lID0gSW1hZ2VzLklNR19XRUJfUEFSQU1fSU47DQotCQkNCi0JCWlmICgob2JqZWN0IGluc3RhbmNlb2YgSVdlYlBhcmFtKSAmJiAoKElXZWJQYXJhbSkgb2JqZWN0KS5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscygicmV0dXJuIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsgDQotCQkJaW1hZ2VOYW1lID0gSW1hZ2VzLklNR19XRUJfUEFSQU1fT1VUOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgSW1hZ2VzLklOU1RBTkNFLmdldEltYWdlKGltYWdlTmFtZSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSANCi0JewkNCi0JCXJldHVybiAoKElXZWJQYXJhbSlvYmplY3QpLmdldE5hbWUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJQYXJhbS5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fS0lORDoNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9QQVJBTV9fVFlQRV9OQU1FOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1BBUkFNX19QQVJUX05BTUU6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX1RBUkdFVF9OQU1FU1BBQ0U6DQotCQkJY2FzZSBEb21QYWNrYWdlLklXRUJfUEFSQU1fX0hFQURFUjoNCi0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOw0KLQkJCQlyZXR1cm47DQotCQl9DQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4NCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgew0KLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVDYXRlZ29yeSgpDQotCXsNCi0JCXJldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJQYXJhbUFubm90YXRpb25DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkDQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZUl0ZW1Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM4OTQwODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotDQotLyoqDQotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlfSBvYmplY3QuDQotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0gKiBAZ2VuZXJhdGVkDQotICovDQotcHVibGljIGNsYXNzIElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCQ0KLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7DQotCQl9DQotDQotCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7DQotDQotCQlhZGRTZXJ2aWNlRW5kcG9pbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFRhcmdldE5hbWVzcGFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCWFkZFdzZGxMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOw0KLQkJCQ0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7DQotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2Vfc2VydmljZUVuZHBvaW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV9zZXJ2aWNlRW5kcG9pbnRfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1NFUlZJQ0VfRU5EUE9JTlQsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgdHJ1ZSwNCi0JCQkJIG51bGwsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBOYW1lc3BhY2UgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXROYW1lc3BhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgew0KLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkDQotCQkJKG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcg0KLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwNCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2VfdGFyZ2V0TmFtZXNwYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV90YXJnZXROYW1lc3BhY2VfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkgRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfX1RBUkdFVF9OQU1FU1BBQ0UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBnZXROYW1lQ2F0ZWdvcnkoKSwNCi0JCQkJIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShuZXcgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXINCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksDQotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwNCi0JCQkJIGdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JV2ViU2VydmljZV9wb3J0TmFtZV9mZWF0dXJlIiwgIl9VSV9JV2ViU2VydmljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fUE9SVF9OQU1FLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFLA0KLQkJCQkgZ2V0TmFtZUNhdGVnb3J5KCksDQotCQkJCSBudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIExvY2F0aW9uIGZlYXR1cmUuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbExvY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZV93c2RsTG9jYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0lXZWJTZXJ2aWNlX3dzZGxMb2NhdGlvbl9mZWF0dXJlIiwgIl9VSV9JV2ViU2VydmljZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCSBEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9fV1NETF9MT0NBVElPTiwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBmYWxzZSwNCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSwNCi0JCQkJIGdldE5hbWVDYXRlZ29yeSgpLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgSVdlYlNlcnZpY2UuZ2lmLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBJbWFnZXMuSU5TVEFOQ0UuZ2V0SW1hZ2UoSW1hZ2VzLklNR19XRUJfU0VSVklDRSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgew0KLQkJU3RyaW5nIGxhYmVsID0gKChJV2ViU2VydmljZSlvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQNCi0JCQlsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgew0KLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsNCi0JCQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJTZXJ2aWNlLmNsYXNzKSkgew0KLQkJY2FzZSBEb21QYWNrYWdlLklXRUJfU0VSVklDRV9fU0VSVklDRV9FTkRQT0lOVDoNCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsNCi0JCXJldHVybiBEb21VaS5JTlNUQU5DRTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUNhdGVnb3J5KCkNCi0Jew0KLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VBbm5vdGF0aW9uQ2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JV2ViU2VydmljZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTY4MWU3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwucGx1Z2luLkRvbVVpOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3R9IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyDQotCWV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcg0KLQlpbXBsZW1lbnRzCQ0KLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQ0KLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJDQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQ0KLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7DQotCS8qKg0KLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOw0KLQ0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsNCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsNCi0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZA0KLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yDQotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLA0KLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksDQotCQkJCSBnZXRTdHJpbmcoIl9VSV9JV2ViU2VydmljZVByb2plY3RfbmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQNCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X25hbWVfZmVhdHVyZSIsICJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJIERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUUsDQotCQkJCSBmYWxzZSwNCi0JCQkJIGZhbHNlLA0KLQkJCQkgZmFsc2UsDQotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UsDQotCQkJCSBudWxsLA0KLQkJCQkgbnVsbCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbg0KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3INCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7DQotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOw0KLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUyk7DQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTKTsNCi0JCX0NCi0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgew0KLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcg0KLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLg0KLQ0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElXZWJTZXJ2aWNlUHJvamVjdC5naWYuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgew0KLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIEltYWdlcy5JTlNUQU5DRS5nZXRJbWFnZShJbWFnZXMuSU1HX0RPTV9XU19QUk9WSURFUikpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElXZWJTZXJ2aWNlUHJvamVjdClvYmplY3QpLmdldE5hbWUoKTsNCi0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPw0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJTZXJ2aWNlUHJvamVjdF90eXBlIikgOiAvLyROT04tTkxTLTEkDQotCQkJZ2V0U3RyaW5nKCJfVUlfSVdlYlNlcnZpY2VQcm9qZWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQ0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKElXZWJTZXJ2aWNlUHJvamVjdC5jbGFzcykpIHsNCi0JCQljYXNlIERvbVBhY2thZ2UuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX05BTUU6DQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsNCi0JCQkJcmV0dXJuOw0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fV0VCX1NFUlZJQ0VTOg0KLQkJCWNhc2UgRG9tUGFja2FnZS5JV0VCX1NFUlZJQ0VfUFJPSkVDVF9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VTOg0KLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7DQotCQkJCXJldHVybjsNCi0JCX0NCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbg0KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0Lg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7DQotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOw0KLQ0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQNCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXINCi0JCQkJKERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9TRVJWSUNFX1BST0pFQ1RfX1dFQl9TRVJWSUNFUywNCi0JCQkJIERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCkpKTsNCi0NCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkDQotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyDQotCQkJCShEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfU0VSVklDRV9QUk9KRUNUX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRVMsDQotCQkJCSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7DQotCQlyZXR1cm4gRG9tVWkuSU5TVEFOQ0U7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL0lXZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmFiMzViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSVdlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWk7DQotDQotDQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLmludGVybmFsLnBsdWdpbi5Eb21VaTsNCi0NCi0vKioNCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlR5cGV9IG9iamVjdC4NCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLSAqIEBnZW5lcmF0ZWQNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSVdlYlR5cGVJdGVtUHJvdmlkZXINCi0JZXh0ZW5kcyBJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyDQotCWltcGxlbWVudHMJDQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJDQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQ0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkNCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJDQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsNCi0JLyoqDQotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBJV2ViVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgew0KLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7DQotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgew0KLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsNCi0NCi0JCX0NCi0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyByZXR1cm5zIElXZWJUeXBlLmdpZi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsNCi0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JV2ViVHlwZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7DQotCQlTdHJpbmcgbGFiZWwgPSAoKElXZWJUeXBlKW9iamVjdCkuZ2V0TmFtZSgpOw0KLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/DQotCQkJZ2V0U3RyaW5nKCJfVUlfSVdlYlR5cGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJA0KLQkJCWdldFN0cmluZygiX1VJX0lXZWJUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZA0KLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7DQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOw0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuDQotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsNCi0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQGdlbmVyYXRlZA0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgew0KLQkJcmV0dXJuIERvbVVpLklOU1RBTkNFOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc1YTkwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uRG9tVWk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLQ0KLS8qKg0KLSAqIEltYWdlcyBidW5kbGUuIFVzZSB0aGlzIGNsYXNzIHdoZW4geW91IG5lZWQgdG8gbG9hZCBzb21lIGltYWdlLiANCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEltYWdlcw0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZXMgSU5TVEFOQ0UgPSBuZXcgSW1hZ2VzKCk7DQotCQ0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX01FVEhPRAkJPSAiV2ViTWV0aG9kIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1BBUkFNX0lOCQk9ICJXZWJQYXJhbUluIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1BBUkFNX09VVAk9ICJXZWJQYXJhbU91dCI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dFQl9TRVJWSUNFCQk9ICJXZWJTZXJ2aWNlIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0VCX1NFUlZJQ0VfR1JPVVAgPSAiV2ViU2VydmljZUdyb3VwIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfU0VJCQkJCT0gIlNFSSI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1NFSV9HUk9VUAkJPSAiU0VJR3JvdXAiOyAvLyROT04tTkxTLTEkDQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19ET01fV1NfUFJPVklERVIJPSAiRE9NV1NQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VSUk9SX01BUktFUgkJPSAiZXJyb3Jfb2JqIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0FSTklOR19NQVJLRVIJPSAid2FybmluZ19vYmoiOyAvLyROT04tTkxTLTEkDQotDQotICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGljb25zQnVuZGxlOw0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IG1JbWFnZVJlZ2lzdHJ5Ow0KLQ0KLSAgICAvKioNCi0gICAgICogQ29uc3RydWN0b3INCi0gICAgICovDQotICAgIHB1YmxpYyBJbWFnZXMoKSANCi0gICAgew0KLQkJdHJ5IHsNCi0JCQlpY29uc0J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW4uV1NJbWFnZUJ1bmRsZSIpOyAvLyROT04tTkxTLTEkDQotCQl9IA0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7DQotCQkJKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoIlVuYWJsZSB0byBsb2FkIGltYWdlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnaW4hIiwgeCk7IC8vJE5PTi1OTFMtMSQNCi0JCQlpY29uc0J1bmRsZSA9IG51bGw7DQotCQl9DQotCX0NCi0gICAgDQotICAgIA0KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW1hZ2VSZWdpc3RyeSgpIA0KLSAgICB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9TRVJWSUNFLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX1NFUlZJQ0UiKSkpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1NFUlZJQ0VfR1JPVVAsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XRUJfU0VSVklDRV9HUk9VUCIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1NFSSwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1NFSSIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1NFSV9HUk9VUCwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1NFSV9HUk9VUCIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX0RPTV9XU19QUk9WSURFUiwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX0RPTV9XU19QUk9WSURFUiIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICBtSW1hZ2VSZWdpc3RyeS5wdXQoSU1HX1dFQl9NRVRIT0QsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XRUJfTUVUSE9EIikpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1BBUkFNX0lOLCBnZXRJbWFnZVJlc291cmNlKGljb25zQnVuZGxlDQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3RyaW5nKCJJTUdfV0VCX1BBUkFNX0lOIikpKTsgICAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0VCX1BBUkFNX09VVCwgZ2V0SW1hZ2VSZXNvdXJjZShpY29uc0J1bmRsZQ0KLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZygiSU1HX1dFQl9QQVJBTV9PVVQiKSkpOyAgICAgICAgICAgICAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgbUltYWdlUmVnaXN0cnkucHV0KElNR19FUlJPUl9NQVJLRVIsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19FUlJPUl9NQVJLRVIiKSkpOyAgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1JbWFnZVJlZ2lzdHJ5LnB1dChJTUdfV0FSTklOR19NQVJLRVIsIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoIklNR19XQVJOSU5HX01BUktFUiIpKSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICANCi0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgIChuZXcgTG9nZ2VyKCkpLmxvZ0Vycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBpbWFnZSByZWdpc3RyeSAhIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgIH0NCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIA0KLSAgICB7DQotICAgICAgICBpZiAobUltYWdlUmVnaXN0cnkgPT0gbnVsbCkgew0KLSAgICAgICAgICAgIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KCk7DQotICAgICAgICB9DQotICAgICAgICANCi0gICAgICAgIHJldHVybiBtSW1hZ2VSZWdpc3RyeTsNCi0gICAgfQ0KLSAgICANCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZU5hbWUpIA0KLSAgICB7DQotICAgICAgICByZXR1cm4gSU5TVEFOQ0UuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChpbWFnZU5hbWUpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZVJlc291cmNlQnlLZXkoU3RyaW5nIHJlc291cmNlTmFtZSkgew0KLSAgICAgICAgcmV0dXJuIGdldEltYWdlUmVzb3VyY2UoaWNvbnNCdW5kbGUuZ2V0U3RyaW5nKHJlc291cmNlTmFtZSkpOw0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZVJlc291cmNlKFN0cmluZyByZXNvdXJjZU5hbWUpIA0KLSAgICB7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgCVVSTCB1cmwgPSBEb21VaS5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VOYW1lKTsNCi0gICAgICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsNCi0gICAgICAgIH0gDQotICAgICAgICBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7DQotICAgICAgICAgICAgKG5ldyBMb2dnZXIoKSkubG9nRXJyb3IoTWVzc2FnZUZvcm1hdC5mb3JtYXQoIlVuYWJsZSB0byBsb2NhdGUgcmVzb3VyY2UgezB9ISIscmVzb3VyY2VOYW1lKSwgbnBlKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOw0KLSAgICAgICAgfQ0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvaW1wbC9ET01JdGVtUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NmIzMjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eURlc2NyaXB0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eURlZmF1bHRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuSVByb3BlcnR5U3RhdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5kZWZhdWx0cy5Qcm9wZXJ0eURlZmF1bHRzQWRhcHRlckZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5zdGF0ZS5Qcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3Rvcnk7DQotDQotLyoqDQotICogRXh0ZW5kcyB7QGxpbmsgUHJvcGVydHlEZXNjcmlwdG9yfSB0byByZXByZXNlbnQgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgRE9NIG9iamVjdHMuIA0KLSAqIFRoaXMgY2xhc3Mgb3ZlcnJpZGVzIGNyZWF0ZVByb3BlcnR5VmFsdWVXcmFwcGVyIGZvcm0ge0BsaW5rIFByb3BlcnR5RGVzY3JpcHRvcn0gdG8gcHJvdmlkZQ0KLSAqIGN1c3RvbSBwcm9wZXJ0eSB3cmFwcGVyIGNsYXNzLg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yIA0KLXsNCi0JcHVibGljIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LA0KLQkJCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yLCANCi0JCQkJU3RyaW5nIGRpc3BsYXlOYW1lLA0KLQkJCQlTdHJpbmcgZGVzY3JpcHRpb24sIA0KLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgDQotCQkJCWJvb2xlYW4gaXNTZXR0YWJsZSwNCi0JCQkJYm9vbGVhbiBtdWx0aUxpbmUsIA0KLQkJCQlib29sZWFuIHNvcnRDaG9pY2VzLCANCi0JCQkJT2JqZWN0IHN0YXRpY0ltYWdlLA0KLQkJCQlTdHJpbmcgY2F0ZWdvcnksIA0KLQkJCQlTdHJpbmdbXSBmaWx0ZXJGbGFncykgDQotCXsNCi0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCByZXNvdXJjZUxvY2F0b3IsIGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiwgZmVhdHVyZSwNCi0JCQkJaXNTZXR0YWJsZSwgbXVsdGlMaW5lLCBzb3J0Q2hvaWNlcywgc3RhdGljSW1hZ2UsIGNhdGVnb3J5LCBmaWx0ZXJGbGFncyk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUHJvcGVydHlWYWx1ZVdyYXBwZXIoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIA0KLQl7DQotCQlyZXR1cm4gbmV3IERPTVByb3BlcnR5VmFsdWUoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcHJvcGVydHlWYWx1ZSwgbnVsbCk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBjYW5TZXRQcm9wZXJ0eShPYmplY3Qgb2JqZWN0KQ0KLQl7DQotCQlmaW5hbCBJUHJvcGVydHlTdGF0ZSBzdGF0ZSA9IChJUHJvcGVydHlTdGF0ZSlQcm9wZXJ0eVN0YXRlQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuYWRhcHQob2JqZWN0LCBJUHJvcGVydHlTdGF0ZS5jbGFzcyk7DQotCQlpZiAoc3RhdGUgIT0gbnVsbCkgew0KLQkJCXN1cGVyLmlzU2V0dGFibGUgPSBzdGF0ZS5pc0NoYW5nZWFibGUoZmVhdHVyZSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBzdXBlci5jYW5TZXRQcm9wZXJ0eShvYmplY3QpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCkNCi0Jew0KLQkJZmluYWwgSVByb3BlcnR5RGVmYXVsdHMgZGVmYXVsdHMgPSAoSVByb3BlcnR5RGVmYXVsdHMpUHJvcGVydHlEZWZhdWx0c0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmFkYXB0KG9iamVjdCwgSVByb3BlcnR5RGVmYXVsdHMuY2xhc3MpOw0KLQkJaWYgKGRlZmF1bHRzICE9IG51bGwpIHsNCi0JCQlmaW5hbCBPYmplY3QgZGVmYXVsdFZhbHVlID0gZGVmYXVsdHMuZ2V0RGVmYXVsdChmZWF0dXJlKTsNCi0JCQkoKEVPYmplY3Qpb2JqZWN0KS5lU2V0KGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7DQotCQl9IA0KLQkJZWxzZSB7DQotCQkJc3VwZXIucmVzZXRQcm9wZXJ0eVZhbHVlKG9iamVjdCk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL2ltcGwvRE9NUHJvcGVydHlWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL2ltcGwvRE9NUHJvcGVydHlWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNGM1MjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9pbXBsL0RPTVByb3BlcnR5VmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JRE9NUHJvcGVydHlWYWx1ZTsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBvZiB7QGxpbmsgSURPTVByb3BlcnR5VmFsdWV9Lg0KLSAqIA0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NUHJvcGVydHlWYWx1ZSBleHRlbmRzIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuUHJvcGVydHlWYWx1ZVdyYXBwZXIgaW1wbGVtZW50cyBJRE9NUHJvcGVydHlWYWx1ZSANCi17DQotCXB1YmxpYyBET01Qcm9wZXJ0eVZhbHVlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0LCBPYmplY3QgcHJvcGVydHlWYWx1ZSwgT2JqZWN0IG5lc3RlZFByb3BlcnR5U291cmMpIA0KLQl7DQotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBwcm9wZXJ0eVZhbHVlLCBuZXN0ZWRQcm9wZXJ0eVNvdXJjKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoKSB7DQotCQlyZXR1cm4gZ2V0RWRpdGFibGVWYWx1ZShudWxsKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvcGx1Z2luL0RvbVVpLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvaW50ZXJuYWwvcGx1Z2luL0RvbVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI5YTU3NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9Eb21VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOw0KLQ0KLS8qKg0KLSAqIFRoaXMgaXMgdGhlIGNlbnRyYWwgc2luZ2xldG9uIGZvciB0aGUgRG9tIGVkaXQgcGx1Z2luLg0KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotICogQGdlbmVyYXRlZA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEb21VaSBleHRlbmRzIEVNRlBsdWdpbg0KLXsNCi0JLyoqDQotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9tVWkgSU5TVEFOQ0UgPSBuZXcgRG9tVWkoKTsNCi0NCi0JLyoqDQotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuDQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgRG9tVWkoKQ0KLQl7DQotCQlzdXBlcg0KLQkJICAobmV3IFJlc291cmNlTG9jYXRvciBbXSANCi0JCSAgIHsNCi0JCSAgIH0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKQ0KLQl7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLg0KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLg0KLQkgKiBAZ2VuZXJhdGVkDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpDQotCXsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4NCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQotCSAqIEBnZW5lcmF0ZWQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luDQotCXsNCi0JCS8qKg0KLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4NCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCi0JCSAqIEBnZW5lcmF0ZWQNCi0JCSAqLw0KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkNCi0JCXsNCi0JCQlzdXBlcigpOw0KLQ0KLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuDQotCQkJLy8NCi0JCQlwbHVnaW4gPSB0aGlzOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgUGx1Z2luIGdldERlZmF1bHQoKQ0KLQl7DQotCQlyZXR1cm4gcGx1Z2luOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS91aS9pbnRlcm5hbC9wbHVnaW4vV1NJbWFnZUJ1bmRsZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9XU0ltYWdlQnVuZGxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI0YWFmMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL2ludGVybmFsL3BsdWdpbi9XU0ltYWdlQnVuZGxlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotSU1HX1dFQl9TRVJWSUNFPWljb25zL1dlYl9TZXJ2aWNlLmdpZg0KLUlNR19XRUJfU0VSVklDRV9HUk9VUD1pY29ucy9XZWJfU2VydmljZV9Hcm91cC5naWYNCi1JTUdfU0VJPWljb25zL1NFSS5naWYNCi1JTUdfU0VJX0dST1VQPWljb25zL1NFSV9Hcm91cC5naWYNCi1JTUdfRE9NX1dTX1BST1ZJREVSPWljb25zL1dlYl9TZXJ2aWNlX0l0ZW1fUHJvdmlkZXIuZ2lmDQotSU1HX1dFQl9NRVRIT0Q9aWNvbnMvV2ViX01ldGhvZC5naWYNCi1JTUdfV0VCX1BBUkFNX0lOPWljb25zL1dlYl9QYXJhbV9Jbi5naWYNCi1JTUdfV0VCX1BBUkFNX09VVD1pY29ucy9XZWJfUGFyYW1fT3V0LmdpZg0KLUlNR19FUlJPUl9NQVJLRVI9aWNvbnMvZXJyb3Jfb2JqLmdpZg0KLUlNR19XQVJOSU5HX01BUktFUj1pY29ucy93YXJuaW5nX29iai5naWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU1YTBmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNmVlYmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1RodSBEZWMgMTggMTE6MDA6MjYgR01UIDIwMDgNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwNTJlZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNS4yLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1JbXBvcnQtUGFja2FnZTogamF2YXguandzLAotIGphdmF4Lmp3cy5zb2FwLAotIGphdmF4LnhtbC53czt2ZXJzaW9uPSIyLjEuMCIsCi0gamF2YXgueG1sLndzLmh0dHA7dmVyc2lvbj0iMi4xLjAiLAotIGphdmF4LnhtbC53cy5zb2FwO3ZlcnNpb249IjIuMS4wIiwKLSBvcmcuamRvbTt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmpkb20uaW5wdXQ7dmVyc2lvbj0iMS4wLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5GZWJydWFyeSAxOSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkNGU2MzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXA0KLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgaWNvbnMvLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZWxjbDE2L2ZpbHRlcl9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzllNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZWxjbDE2L2ZpbHRlcl9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldG9vbDE2L25ld2hhbmRsZXJfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V0b29sMTYvbmV3aGFuZGxlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWM1Njc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V0b29sMTYvbmV3aGFuZGxlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvZXZpZXcxNi9hbm5vdGF0aW9uX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L2Fubm90YXRpb25fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDM1ZDYyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L2Fubm90YXRpb25fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvcHJvcF9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9ldmlldzE2L3Byb3BfcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTFjOTk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL2V2aWV3MTYvcHJvcF9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9iaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9iaW5kaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NmUyZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvZmFsc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQ5YjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2h0dHBiaW5kaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9odHRwYmluZGluZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI4ZWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL29iajE2L2h0dHBiaW5kaW5nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9zb2FwYmluZGluZ19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvc29hcGJpbmRpbmdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZjZiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi9zb2FwYmluZGluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvaWNvbnMvb2JqMTYvdHJ1ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi90cnVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy9vYmoxNi90cnVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL3dpemJhbi9uZXdfd2l6LnBuZyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL2ljb25zL3dpemJhbi9uZXdfd2l6LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0MTBlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9pY29ucy93aXpiYW4vbmV3X3dpei5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjVkZDRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWFdTIFVJDQotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgVUkgKEluY3ViYXRpb24pDQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCi0NCi1BTk5PVEFUSU9OU19WSUVXX0NBVEVHT1JZX05BTUU9SkFYLVdTDQotQU5OT1RBVElPTlNfVklFV19OQU1FPUFubm90YXRpb24gUHJvcGVydGllcw0KLQ0KLSNKQVgtV1MgSGFuZGxlciBXaXphcmQNCi1KQVhXU19XSVpBUkRfQ0FURUdPUllfTkFNRT1KQVgtV1MNCi1ORVdfSkFYV1NfSEFORExFUl9MQUJFTD1KQVgtV1MgSGFuZGxlcg0KLU5FV19KQVhXU19IQU5ETEVSX19ERVNDUklQVElPTj1DcmVhdGUgYSBKQVgtV1MgSGFuZGxlcg0KLQ0KLUNPTkZJR1VSRV9IQU5ETEVSU19MQUJFTD1Db25maWd1cmUgSGFuZGxlcnMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2QzZWNiZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/Pg0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPg0KLSAgICAgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIG5hbWU9IiVBTk5PVEFUSU9OU19WSUVXX0NBVEVHT1JZX05BTUUiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qd3N0LnVpIj4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgICAgIDx2aWV3DQotICAgICAgICAgICAgbmFtZT0iJUFOTk9UQVRJT05TX1ZJRVdfTkFNRSINCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ldmlldzE2L3Byb3BfcHMuZ2lmIg0KLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuandzdC51aSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyI+DQotICAgICAgPC92aWV3Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSA8IS0tICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPg0KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbiB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuamR0LnVpLkphdmFQZXJzcGVjdGl2ZSI+DQotICAgICAgICAgPHZpZXcNCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvYmxlbVZpZXciDQotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJzdGFjayINCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldyI+DQotICAgICAgICAgPC92aWV3Pg0KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+DQotICAgPC9leHRlbnNpb24+IC0tPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25Jbml0aWFsaXplciI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlNlcnZpY2UiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5XZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYk1ldGhvZCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYk1ldGhvZEF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5XZWJQYXJhbSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlBhcmFtQXR0cmlidXRlSW5pdGlhbGl6ZXIiPg0KLSAgICAgIDwvaW5pdGlhbGl6ZXI+DQotICAgICAgPGluaXRpYWxpemVyDQotICAgICAgICAgICAgYW5ub3RhdGlvbj0iamF2YXguandzLldlYlJlc3VsdCINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uLldlYlJlc3VsdEF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb24uU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4gICAgICANCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuUmVxdWVzdFdyYXBwZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5SZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgICAgIDxpbml0aWFsaXplcg0KLSAgICAgICAgICAgIGFubm90YXRpb249ImphdmF4LnhtbC53cy5SZXNwb25zZVdyYXBwZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5SZXNwb25zZVdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciI+DQotICAgICAgPC9pbml0aWFsaXplcj4NCi0gICAgICA8aW5pdGlhbGl6ZXINCi0gICAgICAgICAgICBhbm5vdGF0aW9uPSJqYXZheC54bWwud3MuQmluZGluZ1R5cGUiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbi5CaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyIj4NCi0gICAgICA8L2luaXRpYWxpemVyPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgDQotICAgPGV4dGVuc2lvbiBpZD0iamF4d3NQcm9wb3NhbENvbXB1dGVyIg0KLSAgICAgICAgIG5hbWU9IkpBWC1XUyBQcm9wb3NhbHMiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPg0KLSAgICAgIDxwcm9wb3NhbENhdGVnb3J5DQotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXZpZXcxNi9hbm5vdGF0aW9uX29iai5naWYiPg0KLSAgICAgIDwvcHJvcG9zYWxDYXRlZ29yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIGlkPSJKQVhXU0phdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciI+DQotICAgICAgPGphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcg0KLSAgICAgICAgICAgIGFjdGl2YXRlPSJ0cnVlIg0KLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS5qYXh3c1Byb3Bvc2FsQ29tcHV0ZXIiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb250ZW50YXNzaXN0LkFubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciI+DQotICAgICAgICAgPHBhcnRpdGlvbg0KLSAgICAgICAgICAgICAgIHR5cGU9Il9fZGZ0bF9wYXJ0aXRpb25fY29udGVudF90eXBlIj4NCi0gICAgICAgICA8L3BhcnRpdGlvbj4NCi0gICAgICAgICA8cGFydGl0aW9uDQotICAgICAgICAgICAgICAgdHlwZT0iX19qYXZhX3N0cmluZyI+DQotICAgICAgICAgPC9wYXJ0aXRpb24+DQotICAgICAgPC9qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI+DQotICAgPC9leHRlbnNpb24+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLnF1aWNrRml4UHJvY2Vzc29ycyI+DQotICAgICAgPHF1aWNrRml4UHJvY2Vzc29yDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkpBWFdTUXVpY2tGaXhQcm9jZXNzb3IiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkpBWFdTUXVpY2tGaXhQcm9jZXNzb3IiPg0KLSAgICAgICAgIDxoYW5kbGVkTWFya2VyVHlwZXM+DQotICAgICAgICAgICAgPG1hcmtlclR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5jb21waWxlLnByb2JsZW0iLz4NCi0gICAgICAgICAgICA8bWFya2VyVHlwZSBpZD0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLm5vbnJlY29uY2lsZS5jb21waWxlLnByb2JsZW0iLz4NCi0gICAgICAgICA8L2hhbmRsZWRNYXJrZXJUeXBlcz4NCi0gICAgICA8L3F1aWNrRml4UHJvY2Vzc29yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4NCi0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcg0KLSAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5jb21waWxlLnByb2JsZW0iDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkFQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciI+DQotICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPg0KLSAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yDQotICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLm5vbnJlY29uY2lsZS5jb21waWxlLnByb2JsZW0iDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uLkFQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciI+DQotICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPg0KLSAgICAgIDx3aXphcmQNCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLnVpLm5ldy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkud2l6YXJkcy5jYXRlZ29yeSINCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2V0b29sMTYvbmV3aGFuZGxlcl93aXouZ2lmIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkcy5OZXdKQVhXU0hhbmRsZXJXaXphcmQiDQotICAgICAgICAgICAgbmFtZT0iJU5FV19KQVhXU19IQU5ETEVSX0xBQkVMIj4NCi0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzLk5ld0pBWFdTSGFuZGxlcldpemFyZCI+DQotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhdHlwZSIgdmFsdWU9InRydWUiLz4NCi0gICAgICAgICA8L2NsYXNzPg0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICAlTkVXX0pBWFdTX0hBTkRMRVJfX0RFU0NSSVBUSU9ODQotICAgICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8L3dpemFyZD4NCi0gICAgICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLndpemFyZHMuY2F0ZWdvcnkiDQotICAgICAgICAgICAgbmFtZT0iJUpBWFdTX1dJWkFSRF9DQVRFR09SWV9OQU1FIg0KLSAgICAgICAgICAgIHBhcmVudENhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MudWkubmV3Ij4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIA0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4NCi0gICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciNQb3B1cE1lbnU/YWZ0ZXI9YWRkaXRpb25zIj4NCi0gICAgICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyINCi0gICAgICAgICAgICBpZD0iamF4d3MuY29uZmlndXJlLmhhbmRsZXJzIg0KLSAgICAgICAgICAgIGxhYmVsPSIlQ09ORklHVVJFX0hBTkRMRVJTX0xBQkVMIg0KLSAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4NCi0gICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJ0cnVlIi8+DQotICAgICAgICAgPC9jb21tYW5kPg0KLSAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyINCi0gICAgICAgICAgICBuYW1lPSIlQ09ORklHVVJFX0hBTkRMRVJTX0xBQkVMIj4NCi0gICAgICA8L2NvbW1hbmQ+DQotICAgPC9leHRlbnNpb24+DQotICAgDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPg0KLSAgICAgIDxoYW5kbGVyDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5oYW5kbGVycy5Db25maWd1cmVIYW5kbGVyQ2hhaW5IYW5kbGVyIg0KLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLmNvbmZpZ3VyZS5oYW5kbGVycyI+DQotICAgICAgICAgPGFjdGl2ZVdoZW4+DQotICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy53ZWJzZXJ2aWNlLnNlbGVjdGVkIi8+DQotICAgICAgICAgPC9hY3RpdmVXaGVuPg0KLSAgICAgICAgIDxlbmFibGVkV2hlbj4NCi0gICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLndlYnNlcnZpY2Uuc2VsZWN0ZWQiLz4NCi0gICAgICAgICA8L2VuYWJsZWRXaGVuPg0KLSAgICAgIDwvaGFuZGxlcj4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4NCi0gICAgICA8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLndlYnNlcnZpY2Uuc2VsZWN0ZWQiPg0KLSAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPg0KLSAgICAgICAgICAgIDxhbmQ+DQotICAgICAgICAgICAgICAgPGNvdW50IHZhbHVlPSIxIi8+DQotICAgICAgICAgICAgICAgPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4NCi0gICAgICAgICAgICAgICAgICA8b3I+DQotICAgICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2UiLz4NCi0gICAgICAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIi8+DQotICAgICAgICAgICAgICAgICAgPC9vcj4NCi0gICAgICAgICAgICAgICA8L2l0ZXJhdGU+DQotICAgICAgICAgICAgPC9hbmQ+DQotICAgICAgICAgPC93aXRoPg0KLSAgICAgIDwvZGVmaW5pdGlvbj4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU0OWYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBKQVhXU1VJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9BRERfTEFCRUw7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0RPV05fTEFCRUw7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRURJVF9BUlJBWV9WQUxVRVNfVElUTEU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX1NFTEVDVF9DTEFTU19USVRMRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9VUF9MQUJFTDsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9ORVNURURfQVJSQVlTX05PVF9TVVBQT1JURUQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fRURJVElOR19TVVBQT1JUX05PVF9WQUxJRF9NRVNTQUdFX1BSRUZJWDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19DT0xVTU5fTkFNRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19OT1RfQVZBSUxBQkxFX09OX1NFTEVDVElPTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19WQUxVRVNfQ09MVU1OX05BTUU7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9OQU1FOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX0ZJTFRFUl9BQ1RJT05fU0VMRUNUX0NBVEVHT1JJRVNfTUVTU0FHRTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTlNfVklFV19OT19TVUlUQUJMRV9MSUJSQVJZX0ZPVU5EOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OU19WSUVXX09USEVSX0FOTk9UQVRJT05fTElCUkFSSUVTX1VTRTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09ORklHVVJFX0pBVkFfMV82X0xJQlJBUlk7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9BTk5PVEFUSU9OOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTUlTU0lOR19NRVRIT0Q7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9VTklNUExFTUVOVEVEX01FVEhPRFM7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQU5HRV9NRVRIT0RfVklTSUJJTElUWTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hBTkdFX01FVEhPRF9SRVRVUk5fVFlQRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ1JFQVRFX0NPTlNUUlVDVE9SOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfQU5OT1RBVElPTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX01FVEhPRDsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0ZJTkFMX01PRElGSUVSOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRU1PVkVfSUxMRUdBTF9NT0RJRklFUjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX1NUQVRJQ19NT0RJRklFUjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX01FTUJFUlZBTFVFUEFJUjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0FMTF9PVEhFUl9NRU1CRVJWQUxVRVBBSVJTOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1dJWkFSRF9USVRMRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDUklQVElPTjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfQUREX0hBTkRMRVJfV0laQVJEX1BBR0VfVElUTEU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0FERF9IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19PUkRFUl9IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19PUkRFUl9IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19DT05GSUdVUkVfSEFORExFUl9XSVpBUkRfVElUTEU7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQUREOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1JFTU9WRTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9NT1ZFX1VQOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX01PVkVfRE9XTjsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9OQU1FX0NPTFVNTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DTEFTU19DT0xVTU47DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfVFlQRV9DT0xVTU47DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0xPR0lDQUw7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX1BST1RPQ09MOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX1RZUEU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0xPR0lDQUxfSEFORExFUjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfU09BUF9IQU5ETEVSOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT047DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BREQ7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ0hPT1NFOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQVNTT0NJQVRFOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV0VCX1NFUlZJQ0U7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEg7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0U7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX1RJVExFOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19ERVNDUklQVElPTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9OQU1FOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTlRFUl9OQU1FOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19DSE9PU0VfRk9MREVSOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19JTlZBTElEX05BTUU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfRVhJU1RTOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX1BST0pFQ1Q7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VNUFRZX0ZJTEVfTkFNRTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX1RJVExFOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9ESUFMT0dfREVTQ1JJUFRJT047DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19JTlZBTElEOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORDsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRklMRV9OT1RfRk9VTkRfSU5fUFJPSkVDVDsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19USVRMRTsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19ERVNDUklQVElPTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19JTlZBTElEOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfTk9UX0ZPVU5EOw0KLQ0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfVElUTEU7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19ERVNDUklQVElPTjsNCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX0lOVkFMSUQ7DQotDQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9ORVdfSEFORExFUl9QQVRIX0VNVFBZOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRVhJU1RJTkdfSEFORExFUl9QQVRIX0VNVFBZOw0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBKQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfUEFUSF9FTVRQWTsNCi0NCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSkFYV1NfSEFORExFUl9FWFRFTkRfSU1QTEVNRU5UX0hBTkRMRVI7DQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBWFdTX0hBTkRMRVJfTElCUkFSWV9DTEFTU1BBVEg7DQotDQotICAgIHN0YXRpYyB7DQotICAgICAgICAvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQ0KLSAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSkFYV1NVSU1lc3NhZ2VzLmNsYXNzKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIEpBWFdTVUlNZXNzYWdlcygpIHsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9KQVhXU1VJTWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UNCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQUREX0xBQkVMPUFkZA0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfQlJPV1NFX0xBQkVMPUJyb3dzZS4uLg0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfRE9XTl9MQUJFTD1Eb3duDQotQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9FRElUX0FSUkFZX1ZBTFVFU19USVRMRT1FZGl0IEFycmF5IFZhbHVlcw0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfUkVNT1ZFX0xBQkVMPVJlbW92ZQ0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfU0VMRUNUX0NMQVNTX1RJVExFPVNlbGVjdCBDbGFzcw0KLUFOTk9UQVRJT05fQVJSQVlfQ0VMTF9FRElUT1JfVVBfTEFCRUw9VXANCi1BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX05FU1RFRF9BUlJBWVNfTk9UX1NVUFBPUlRFRD1OZXN0ZWQgQXJyYXlzIHdpdGhpbiBBcnJheXMgbm90IHlldCBzdXBwb3J0ZWQNCi1BTk5PVEFUSU9OX0VESVRJTkdfU1VQUE9SVF9OT1RfVkFMSURfTUVTU0FHRV9QUkVGSVg9Tm90IGEgdmFsaWQgDQotDQotQU5OT1RBVElPTlNfVklFV19BTk5PVEFUSU9OU19OT1RfQVZBSUxBQkxFX09OX1NFTEVDVElPTj1Bbm5vdGF0aW9ucyBub3QgYXZhaWxhYmxlIGZvciBjdXJyZW50IHNlbGVjdGlvbg0KLUFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfVkFMVUVTX0NPTFVNTl9OQU1FPVZhbHVlcw0KLUFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfQ09MVU1OX05BTUU9QW5ub3RhdGlvbnMNCi0NCi1BTk5PVEFUSU9OU19WSUVXX0ZJTFRFUl9BQ1RJT05fTkFNRT1GaWx0ZXJzLi4uDQotQU5OT1RBVElPTlNfVklFV19GSUxURVJfQUNUSU9OX1NFTEVDVF9DQVRFR09SSUVTX01FU1NBR0U9U2VsZWN0IEFubm90YXRpb24gQ2F0ZWdvcmllcyB0byBGaWx0ZXINCi0NCi1BTk5PVEFUSU9OU19WSUVXX05PX1NVSVRBQkxFX0xJQlJBUllfRk9VTkQ9Tm8gc3VpdGFibGUgezB9IGxpYnJhcnkgY2FuIGJlIGZvdW5kIG9uIHRoZSBwcm9qZWN0cyBjbGFzc3BhdGguXG5cbg0KLQ0KLUFOTk9UQVRJT05TX1ZJRVdfT1RIRVJfQU5OT1RBVElPTl9MSUJSQVJJRVNfVVNFPVxuKEZvciB1c2Ugd2l0aCBub24gSkFYLVdTIGxpYnJhcmllcyBwbGVhc2Ugc2V0dXAgdGhlIHByb2plY3Qgd2l0aCB0aGUgcmVxdWlyZWQgbGlicmFyaWVzLilcblxuDQotDQotSkFYV1NfSEFORExFUl9XSVpBUkRfVElUTEU9TmV3IEpBWC1XUyBIYW5kbGVyDQotSkFYV1NfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRT1KQVgtV1MgSGFuZGxlcg0KLUpBWFdTX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT049Q3JlYXRlIGEgbmV3IEpBWC1XUyBIYW5kbGVyLg0KLQ0KLUpBWFdTX0FERF9IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFPUNvbmZpZ3VyZSBIYW5kbGVyIENoYWluDQotSkFYV1NfQUREX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT049Q3JlYXRlIG9yIHNlbGVjdCBhIGhhbmRsZXIgY2hhaW4gZmlsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgd2ViIHNlcnZpY2UuDQotDQotSkFYV1NfT1JERVJfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRT1Db25maWd1cmUgSGFuZGxlciBDaGFpbg0KLUpBWFdTX09SREVSX0hBTkRMRVJfV0laQVJEX1BBR0VfREVTQ1JJUFRJT049Q29uZmlndXJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgaGFuZGxlcnMgaW4gdGhlIGhhbmRsZXIgY2hhaW4gZmlsZS4NCi0NCi1KQVhXU19DT05GSUdVUkVfSEFORExFUl9XSVpBUkRfVElUTEU9Q29uZmlndXJlIEpBWC1XUyBIYW5kbGVyIENoYWluDQotDQotSkFYV1NfSEFORExFUl9BREQ9JkFkZC4uLg0KLUpBWFdTX0hBTkRMRVJfUkVNT1ZFPSZSZW1vdmUuLi4NCi1KQVhXU19IQU5ETEVSX01PVkVfVVA9TW92ZSAmVXANCi1KQVhXU19IQU5ETEVSX01PVkVfRE9XTj1Nb3ZlICZEb3duDQotDQotSkFYV1NfSEFORExFUl9OQU1FX0NPTFVNTj1OYW1lDQotSkFYV1NfSEFORExFUl9DTEFTU19DT0xVTU49Q2xhc3MNCi1KQVhXU19IQU5ETEVSX1RZUEVfQ09MVU1OPVR5cGUNCi0NCi1KQVhXU19MT0dJQ0FMPUxvZ2ljYWwNCi1KQVhXU19QUk9UT0NPTD1Qcm90b2NvbA0KLQ0KLUpBWFdTX0hBTkRMRVJfVFlQRT0mSGFuZGxlciB0eXBlOg0KLUpBWFdTX0xPR0lDQUxfSEFORExFUj1Mb2dpY2FsIEhhbmRsZXINCi1KQVhXU19TT0FQX0hBTkRMRVI9UHJvdG9jb2wgSGFuZGxlciAoU09BUCkNCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT049Q29uZmlndXJhdGlvbg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BREQ9QWRkIHRoaXMgaGFuZGxlciB0byBhIGhhbmRsZXIgY2hhaW4NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFPUNyZWF0ZSBhIG5ldyBoYW5kbGVyIGNoYWluIGZpbGUNCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVD1BZGQgdGhpcyBoYW5kbGVyIHRvIGFuIGV4aXN0aW5nIGhhbmRsZXIgY2hhaW4gZmlsZQ0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DSE9PU0U9Q2hvb3NlIGFuIGV4aXN0aW5nIGhhbmRsZXIgY2hhaW4gZmlsZQ0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BU1NPQ0lBVEU9QXNzb2NpYXRlIHRoaXMgaGFuZGxlciBjaGFpbiB3aXRoIGEgd2ViIHNlcnZpY2UNCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV0VCX1NFUlZJQ0U9V2ViIFNlcnZpY2U6DQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0ZJTEVfUEFUSD1GaWxlIHBhdGg6DQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRT1Ccm93c2UuLi4NCi0NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19USVRMRT1IYW5kbGVyIENoYWluIENyZWF0aW9uDQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfREVTQ1JJUFRJT049U2VsZWN0IHRoZSBwYXJlbnQgZm9sZGVyOg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfTkFNRT1GaWxlIG5hbWU6DQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRU5URVJfTkFNRT1IYW5kbGVyIGNoYWluIGZpbGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuDQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfQ0hPT1NFX0ZPTERFUj1DaG9vc2UgcGFyZW50IGZvbGRlci4NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19JTlZBTElEX05BTUU9SW52YWxpZCBoYW5kbGVyIGNoYWluIGZpbGUgbmFtZS4NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX0VYSVNUUz1UaGUgezB9IGZpbGUgYWxyZWFkeSBleGlzdHMuDQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNUPVRoZSBoYW5kbGVyIGNoYWluIGZpbGUgbXVzdCByZXNpZGUgd2l0aGluIGEgc291cmNlIGZvbGRlciBpbiB0aGUgezB9IHByb2plY3QuDQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRU1QVFlfRklMRV9OQU1FPUhhbmRsZXIgY2hhaW4gZmlsZSBuYW1lIGNhbm5vdCBiZSBlbXB0eQ0KLQ0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19USVRMRT1IYW5kbGVyIENoYWluIFNlbGVjdGlvbg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19ERVNDUklQVElPTj1DaG9vc2UgYSBoYW5kbGVyIGNoYWluOg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0RJQUxPR19JTlZBTElEPU5vdCBhIHZhbGlkIGhhbmRsZXIgY2hhaW4gZmlsZS4NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORD1DYW5ub3QgZmluZCB0aGUgezB9IGhhbmRsZXIgY2hhaW4gZmlsZS4NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRURJVF9GSUxFX05PVF9GT1VORF9JTl9QUk9KRUNUPUNhbm5vdCBmaW5kIHRoZSB7MH0gaGFuZGxlciBjaGFpbiBmaWxlIGluIHRoZSB7MX0gcHJvamVjdC4NCi0NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfRElBTE9HX1RJVExFPVdlYiBTZXJ2aWNlIFNlbGVjdGlvbg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfREVTQ1JJUFRJT049Q2hvb3NlIGEgd2ViIHNlcnZpY2U6DQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19JTlZBTElEPU5vdCBhIFdlYiBTZXJ2aWNlLg0KLQ0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19USVRMRT1IYW5kbGVyIFNlbGVjdGlvbg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9IQU5ETEVSX0RJQUxPR19ERVNDUklQVElPTj1DaG9vc2UgYSBsb2dpY2FsIG9yIHNvYXAgaGFuZGxlcjoNCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfSU5WQUxJRD1Ob3QgYSBsb2dpY2FsIG9yIHNvYXAgaGFuZGxlci4NCi0NCi1KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fTkVXX0hBTkRMRVJfUEFUSF9FTVRQWT1OZXcgaGFuZGxlciBjaGFpbiBwYXRoIGlzIGVtcHR5Lg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FWElTVElOR19IQU5ETEVSX1BBVEhfRU1UUFk9RXhpc2l0bmcgaGFuZGxlciBjaGFpbiBwYXRoIGlzIGVtcHR5Lg0KLUpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19QQVRIX0VNVFBZPVdlYiBzZXJ2aWNlIHBhdGggaXMgZW1wdHkuDQotSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX05PVF9GT1VORD1XZWIgc2VydmljZSBjYW5ub3QgYmUgZm91bmQuDQotDQotSkFYV1NfSEFORExFUl9FWFRFTkRfSU1QTEVNRU5UX0hBTkRMRVI9VGhlIGhhbmRsZXIgY2xhc3MgbXVzdCBpbXBsZW1lbnQgb3IgZXh0ZW5kIGZyb20gYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgTG9naWNhbEhhbmRsZXIgb3IgU09BUEhhbmRsZXIuDQotSkFYV1NfSEFORExFUl9MSUJSQVJZX0NMQVNTUEFUSD1BIEpBWC1XUyBsaWJyYXJ5IGNhbm5vdCBiZSBmb3VuZCBvbiB0aGUgcHJvamVjdHMgY2xhc3NwYXRoLg0KLQ0KLUNPTkZJR1VSRV9KQVZBXzFfNl9MSUJSQVJZPVRvIHNlbGVjdCBhIDEuNiBvciBhYm92ZSBjb21wbGlhbnQgSlJFIGNvbmZpZ3VyZSB0aGUgPGEgaHJlZj0iMSIgPkluc3RhbGxlZCBKUkVzPC9hPiBvciBjaGFuZ2UgdGhlIEpSRSBvbiB0aGUgPGEgaHJlZj0iMiIgPkphdmEgYnVpbGQgcGF0aDwvYT4uDQotDQotQUREX0FOTk9UQVRJT049QWRkIGFubm90YXRpb24gJydAezB9JycNCi1BRERfTUlTU0lOR19NRVRIT0Q9QWRkIG1pc3NpbmcgbWV0aG9kDQotQUREX1VOSU1QTEVNRU5URURfTUVUSE9EUz1BZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzDQotQ0hBTkdFX01FVEhPRF9WSVNJQklMSVRZPUNoYW5nZSBtZXRob2QgdmlzaWJpbGl0eSB0byAnJ3swfScnDQotQ0hBTkdFX01FVEhPRF9SRVRVUk5fVFlQRT1DaGFuZ2UgbWV0aG9kIHJldHVybiB0eXBlIHRvIG1hdGNoIFNFSSBtZXRob2QgcmV0dXJuIHR5cGUNCi1DUkVBVEVfQ09OU1RSVUNUT1I9Q3JlYXRlIGNvbnN0cnVjdG9yICcnezB9KCknJw0KLVJFTU9WRV9BTk5PVEFUSU9OPVJlbW92ZSBhbm5vdGF0aW9uICcnQHswfScnDQotUkVNT1ZFX01FVEhPRD1SZW1vdmUgbWV0aG9kICcnezB9JycNCi1SRU1PVkVfRklOQUxfTU9ESUZJRVI9UmVtb3ZlICcnZmluYWwnJyBtb2RpZmllciBvZiAnJ3swfScnKC4uKQ0KLVJFTU9WRV9JTExFR0FMX01PRElGSUVSPVJlbW92ZSBJbGxlZ2FsIG1vZGlmaWVyDQotUkVNT1ZFX1NUQVRJQ19NT0RJRklFUj1SZW1vdmUgJydzdGF0aWMnJyBtb2RpZmllciBvZiAnJ3swfScnKC4uKQ0KLVJFTU9WRV9NRU1CRVJWQUxVRVBBSVI9UmVtb3ZlIG1lbWJlciB2YWx1ZSBwYWlyICcnezB9JycNCi1SRU1PVkVfQUxMX09USEVSX01FTUJFUlZBTFVFUEFJUlM9UmVtb3ZlIGFsbCBvdGhlciBtZW1iZXIgdmFsdWUgcGFpcnMNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL0pBWFdTVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzYxZGM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvSkFYV1NVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi0vKioNCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgSkFYV1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gew0KLQ0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlDQotCXByaXZhdGUgc3RhdGljIEpBWFdTVUlQbHVnaW4gcGx1Z2luOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEpBWFdTVUlQbHVnaW4oKSB7DQotCX0NCi0NCi0JLyoNCi0JICogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOw0KLQkJcGx1Z2luID0gdGhpczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlzdXBlci5zdG9wKGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICoNCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEpBWFdTVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsNCi0JCXJldHVybiBwbHVnaW47DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuDQotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aA0KLQkgKg0KLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aA0KLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsNCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7DQotCX0NCi0JDQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgew0KLSAgICAgICAgSkFYV1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7DQotICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCANCi0gICAgICAgIAkJZXhjZXB0aW9uLnRvU3RyaW5nKCksIGV4Y2VwdGlvbikpOw0KLSAgICB9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYWN0aW9ucy9Bbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYWN0aW9ucy9Bbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4ZjMzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2FjdGlvbnMvQW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3MuQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0gICAgcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLSAgICBwcml2YXRlIEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyIGNhdGVnb3J5RmlsdGVyOwotICAgIAotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24oQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldywgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN1cGVyKHRleHQpOwotICAgICAgICB0aGlzLnZpZXdlciA9IHZpZXdlcjsKLSAgICAgICAgdGhpcy5zZXRJbWFnZURlc2NyaXB0b3IoSkFYV1NVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL2VsY2wxNi9maWx0ZXJfcHMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGNhdGVnb3J5RmlsdGVyID0gbmV3IEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyKGFubm90YXRpb25zVmlldywgdmlld2VyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIExpc3RTZWxlY3Rpb25EaWFsb2cgbGlzdFNlbGVjdGlvbkRpYWxvZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwKLSAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkNhdGVnb3JpZXMoKSwgbmV3IEFubm90YXRpb25zQ2F0ZWdvcnlEaWFsb2dDb250ZW50UHJvdmlkZXIoKSwKLSAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbnNDYXRlZ29yeURpYWxvZ0xhYmVsUHJvdmlkZXIoKSwgCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9TRUxFQ1RfQ0FURUdPUklFU19NRVNTQUdFKTsKLSAgICAgICAgCi0gICAgICAgIGxpc3RTZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGNhdGVnb3J5RmlsdGVyLmdldENhdGVnb3JpZXMoKSk7Ci0gICAgICAgIAotICAgICAgICBpbnQgcmV0dXJuVmFsdWUgPSBsaXN0U2VsZWN0aW9uRGlhbG9nLm9wZW4oKTsKLSAgICAgICAgaWYgKHJldHVyblZhbHVlID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gbGlzdFNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgIGNhdGVnb3J5RmlsdGVyLmZpbHRlckFubm90YXRpb25zKEFycmF5cy5hc0xpc3QocmVzdWx0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdChJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGNhdGVnb3J5RmlsdGVyLmluaXQobWVtZW50byk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0gICAgICAgIGNhdGVnb3J5RmlsdGVyLnNhdmVTdGF0ZShtZW1lbnRvKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbnNDYXRlZ29yeURpYWxvZ0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIExpc3QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChMaXN0PFN0cmluZz4paW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc0NhdGVnb3J5RGlhbG9nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb250ZW50YXNzaXN0L0Fubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb250ZW50YXNzaXN0L0Fubm90YXRpb25Db21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjNmNTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29udGVudGFzc2lzdC9Bbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb250ZW50YXNzaXN0Ow0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7DQotDQotICAgIHB1YmxpYyBBbm5vdGF0aW9uQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7DQotICAgICAgICBzdXBlcigpOw0KLSAgICB9DQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIHsNCi0gICAgICAgICAgICByZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIGNvbnRleHQpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsNCi0gICAgICAgIENvbXBsZXRpb25Db250ZXh0IGNvbXBsZXRpb25Db250ZXh0ID0gY29udGV4dC5nZXRDb3JlQ29udGV4dCgpOw0KLSAgICAgICAgaW50IHRva2VuU3RhcnQgPSBjb21wbGV0aW9uQ29udGV4dC5nZXRPZmZzZXQoKTsNCi0NCi0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gc291cmNlLmdldEVsZW1lbnRBdCh0b2tlblN0YXJ0KTsNCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICBzd2l0Y2goamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgew0KLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OOg0KLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5UWVBFOg0KLSAgICAgICAgICAgICAgICBjYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9ySmF2YUVsZW1lbnQoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25zKA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhRWxlbWVudCksIGphdmFFbGVtZW50LCB0b2tlblN0YXJ0KTsNCi0gICAgICAgICAgICAgICAgY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLSAgICAgICAgICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKChJTWV0aG9kKSBqYXZhRWxlbWVudCwgdG9rZW5TdGFydCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxWYXJpYWJsZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JKYXZhRWxlbWVudChBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbnMoDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFZhcmlhYmxlKSwgbG9jYWxWYXJpYWJsZSwgdG9rZW5TdGFydCk7DQotICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucygNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFFbGVtZW50KSwgamF2YUVsZW1lbnQsIHRva2VuU3RhcnQpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JKYXZhRWxlbWVudChMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zLA0KLSAgICAgICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgaW50IG9mZnNldCkgew0KLSAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgew0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgew0KLSAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsNCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IGdldE1lbWJlclZhbHVlUGFpckZvclBvc2l0aW9uKG5vcm1hbEFubm90YXRpb24sIG9mZnNldCk7DQotICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JKYXZhRWxlbWVudChub3JtYWxBbm5vdGF0aW9uLCBtZW1iZXJWYWx1ZVBhaXIsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIFNpbmdsZU1lbWJlckFubm90YXRpb24pIHsNCi0gICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247DQotICAgICAgICAgICAgICAgIGlmIChpc1dpdGhpblNpbmdsZU1lbWJlckFubm90YXRpb25WYWx1ZShzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLCBvZmZzZXQpKSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KHNpbmdsZU1lbWJlckFubm90YXRpb24sIGphdmFFbGVtZW50KTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsNCi0gICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gQW5ub3RhdGlvbnNNYW5hZ2VyDQotICAgICAgICAuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKGphdmFFbGVtZW50LA0KLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0ZvckphdmFFbGVtZW50KFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwNCi0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsNCi0gICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gQW5ub3RhdGlvbnNNYW5hZ2VyDQotICAgICAgICAuZ2V0QW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyRm9yTmFtZShhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkpOw0KLSAgICAgICAgaWYgKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciAhPSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplci5nZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihqYXZhRWxlbWVudCwNCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24pOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KLSAgICB9DQotDQotDQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLSAgICBwcml2YXRlIE1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXJGb3JQb3NpdGlvbihOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24sIGludCBvZmZzZXQpIHsNCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsNCi0gICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsNCi0gICAgICAgICAgICBFeHByZXNzaW9uIHZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7DQotICAgICAgICAgICAgaW50IHZhbHVlU3RhcnRQb3NpdGlvbiA9IHZhbHVlLmdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgICAgICAgICBpbnQgdmFsdWVMZW5ndGggPSB2YWx1ZS5nZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHZhbHVlU3RhcnRQb3NpdGlvbg0KLSAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDw9IHZhbHVlU3RhcnRQb3NpdGlvbiArIHZhbHVlTGVuZ3RoKSB7DQotICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXI7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzV2l0aGluU2luZ2xlTWVtYmVyQW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiwgaW50IG9mZnNldCkgew0KLSAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZSA9IHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKTsNCi0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7DQotICAgICAgICAgICAgaW50IHZhbHVlU3RhcnRQb3NpdGlvbiA9IHZhbHVlLmdldFN0YXJ0UG9zaXRpb24oKTsNCi0gICAgICAgICAgICBpbnQgdmFsdWVMZW5ndGggPSB2YWx1ZS5nZXRMZW5ndGgoKTsNCi0gICAgICAgICAgICByZXR1cm4gKG9mZnNldCA+PSB2YWx1ZVN0YXJ0UG9zaXRpb24gJiYgb2Zmc2V0IDw9IHZhbHVlU3RhcnRQb3NpdGlvbiArIHZhbHVlTGVuZ3RoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgfQ0KLQ0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgcHVibGljIExpc3QgY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2Vzc2lvblN0YXJ0ZWQoKSB7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FQVENvbXBpbGVQcm9ibGVtTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM5ZDZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkVjbGlwc2VNZXNzYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29ycmVjdGlvbkVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsTWFya2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuY29ycmVjdGlvbi5Bc3Npc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5jb3JyZWN0aW9uLkphdmFDb3JyZWN0aW9uUHJvY2Vzc29yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5jb3JyZWN0aW9uLlByb2JsZW1Mb2NhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuY29ycmVjdGlvbi5Db3JyZWN0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5Db3JyZWN0aW9uTWFya2VyUmVzb2x1dGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUHJvYmxlbUxvY2F0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBBUFRDb21waWxlUHJvYmxlbU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjIgew0KLQ0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJTWFya2VyUmVzb2x1dGlvbltdIE5PX1JFU09MVVRJT05TID0gbmV3IElNYXJrZXJSZXNvbHV0aW9uWzBdOw0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgew0KLQkJaW50IGlkID0gbWFya2VyLmdldEF0dHJpYnV0ZShJSmF2YU1vZGVsTWFya2VyLklELCAtMSk7DQotICAgICAgICBpZiAoaWQgPT0gRWNsaXBzZU1lc3NhZ2VyLkFQVF9RVUlDS19GSVhfUFJPQkxFTV9JRCkgew0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOw0KLSAgICAgICAgfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIElNYXJrZXJSZXNvbHV0aW9uW10gZ2V0UmVzb2x1dGlvbnMoSU1hcmtlciBtYXJrZXIpIHsNCi0JCWlmICghaGFzUmVzb2x1dGlvbnMobWFya2VyKSkgew0KLQkJCXJldHVybiBOT19SRVNPTFVUSU9OUzsNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQobWFya2VyKTsNCi0JCQ0KLQkJaWYgKGNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7DQotCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIGNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0JCQlpZiAoZWRpdG9ySW5wdXQgIT0gbnVsbCkgew0KLQkJCQlJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiA9IGNyZWF0ZVByb2JsZW1Mb2NhdGlvbihtYXJrZXIpOw0KLQkJCQlpZiAocHJvYmxlbUxvY2F0aW9uICE9IG51bGwpIHsNCi0JCQkJCUlJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCA9IG5ldyBBc3Npc3RDb250ZXh0KGNvbXBpbGF0aW9uVW5pdCwNCi0JCQkJCQkJcHJvYmxlbUxvY2F0aW9uLmdldE9mZnNldCgpLCBwcm9ibGVtTG9jYXRpb24uZ2V0TGVuZ3RoKCkpOw0KLQkJCQkJDQotCQkJCQlMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsNCi0JCQkJCQ0KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBKYXZhQ29ycmVjdGlvblByb2Nlc3Nvci5jb2xsZWN0Q29ycmVjdGlvbnMoaW52b2NhdGlvbkNvbnRleHQsIA0KLQkJCQkJCQluZXcgSVByb2JsZW1Mb2NhdGlvbltdIHsgcHJvYmxlbUxvY2F0aW9uIH0sIGNvbXBsZXRpb25Qcm9wb3NhbHMpOw0KLSAgICAgICAgICAgICAgICAgICAgDQotCQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoY29tcGxldGlvblByb3Bvc2FscywgbmV3IENvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3IoKSk7DQotDQotICAgIAkJCQkJSU1hcmtlclJlc29sdXRpb25bXSBtYXJrZXJSZXNvbHV0aW9ucyA9IG5ldyBJTWFya2VyUmVzb2x1dGlvbltjb21wbGV0aW9uUHJvcG9zYWxzLnNpemUoKV07DQotICAgIAkJCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNvbXBsZXRpb25Qcm9wb3NhbHMuc2l6ZSgpOyBpKyspIHsNCi0gICAgCQkJCQkJbWFya2VyUmVzb2x1dGlvbnNbaV0gPSBuZXcgQ29ycmVjdGlvbk1hcmtlclJlc29sdXRpb24oY29tcGlsYXRpb25Vbml0LCANCi0gICAgCQkJCQkJCQlwcm9ibGVtTG9jYXRpb24uZ2V0T2Zmc2V0KCksIHByb2JsZW1Mb2NhdGlvbi5nZXRMZW5ndGgoKSwgDQotICAgIAkJCQkJCQkJY29tcGxldGlvblByb3Bvc2Fscy5nZXQoaSksIG1hcmtlcik7DQotICAgIAkJCQkJfQ0KLSAgICAJCQkJCXJldHVybiBtYXJrZXJSZXNvbHV0aW9uczsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBOT19SRVNPTFVUSU9OUzsNCi0JfQ0KLQ0KLQlwcml2YXRlIElQcm9ibGVtTG9jYXRpb24gY3JlYXRlUHJvYmxlbUxvY2F0aW9uKElNYXJrZXIgbWFya2VyKSB7DQotCQl0cnkgew0KLQkJCWludCBpZCA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSUphdmFNb2RlbE1hcmtlci5JRCwgLTEpOw0KLQkJCWludCBvZmZzZXQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgLTEpOw0KLQkJCWludCBlbmQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIC0xKTsNCi0JCQlpbnQgc2V2ZXJpdHkgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIElNYXJrZXIuU0VWRVJJVFlfSU5GTyk7DQotCQkJU3RyaW5nW10gYXJndW1lbnRzID0gQ29ycmVjdGlvbkVuZ2luZS5nZXRQcm9ibGVtQXJndW1lbnRzKG1hcmtlcik7DQotCQkJU3RyaW5nIG1hcmtlclR5cGUgPSBtYXJrZXIuZ2V0VHlwZSgpOw0KLQkJCWlmIChpZCAhPSAtMSAmJiBvZmZzZXQgIT0gLTEgJiYgZW5kICE9IC0xICYmIGFyZ3VtZW50cyAhPSBudWxsKSB7DQotCQkJCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQ7DQotCQkJCWJvb2xlYW4gaXNFcnJvciA9IChzZXZlcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsNCi0JCQkJcmV0dXJuIG5ldyBQcm9ibGVtTG9jYXRpb24ob2Zmc2V0LCBsZW5ndGgsIGlkLCBhcmd1bWVudHMsIGlzRXJyb3IsIG1hcmtlclR5cGUpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsNCi0JCQlKQVhXU1VJUGx1Z2luLmxvZyhjZS5nZXRTdGF0dXMoKSk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KElNYXJrZXIgbWFya2VyKSB7DQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsNCi0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7DQotICAgICAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKChJRmlsZSkgcmVzb3VyY2UpOw0KLQkJCWlmIChqYXZhRWxlbWVudCAhPSBudWxsICYmIGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgew0KLQkJCQlyZXR1cm4gKElDb21waWxhdGlvblVuaXQpIGphdmFFbGVtZW50Ow0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2MjM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklKYXZhQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgewotCi0gICAgcHJpdmF0ZSBpbnQgcmVsZXZhbmNlOwotICAgIHByaXZhdGUgU3RyaW5nIGRpc3BsYXlTdHJpbmc7Ci0gICAgcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLSAgICBwcml2YXRlIFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2U7Ci0KLSAgICBwcm90ZWN0ZWQgSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0OwotICAgIAotICAgIHB1YmxpYyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgdGhpcy5pbnZvY2F0aW9uQ29udGV4dCA9IGludm9jYXRpb25Db250ZXh0OwotICAgICAgICB0aGlzLmRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotICAgICAgICB0aGlzLnJlbGV2YW5jZSA9IHJlbGV2YW5jZTsKLSAgICAgICAgdGhpcy5pbWFnZSA9IGltYWdlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldFJlbGV2YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlbGV2YW5jZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0gICAgCi0gICAgcHJpdmF0ZSBUZXh0RmlsZUNoYW5nZSBnZXRUZXh0Q2hhbmdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IGludm9jYXRpb25Db250ZXh0LmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICAgICAgdGV4dENoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZShnZXREaXNwbGF5U3RyaW5nKCksIChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICAgICAgdGV4dENoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotICAgICAgICAgICAgdGV4dENoYW5nZS5zZXRLZWVwUHJldmlld0VkaXRzKHRydWUpOwotICAgICAgICAgICAgdGV4dENoYW5nZS5zZXRTYXZlTW9kZShUZXh0RmlsZUNoYW5nZS5MRUFWRV9ESVJUWSk7Ci0gICAgICAgICAgICBhZGRFZGl0cyh0ZXh0Q2hhbmdlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGV4dENoYW5nZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0gICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0gICAgICAgIElVbmRvTWFuYWdlciBtYW5hZ2VyPSBSZWZhY3RvcmluZ0NvcmUuZ2V0VW5kb01hbmFnZXIoKTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgICAgIENoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UgPSBnZXRUZXh0Q2hhbmdlKCk7Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLSAgICAgICAgICAgIFJlZmFjdG9yaW5nU3RhdHVzIHZhbGlkID0gdGV4dENoYW5nZS5pc1ZhbGlkKG1vbml0b3IpOwotICAgICAgICAgICAgaWYgKHZhbGlkLmlzT0soKSkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWJvdXRUb1BlcmZvcm1DaGFuZ2UodGV4dENoYW5nZSk7Ci0gICAgICAgICAgICAgICAgdW5kb0NoYW5nZSA9IHRleHRDaGFuZ2UucGVyZm9ybShtb25pdG9yKTsKLSAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coY2UuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgbWFuYWdlci5jaGFuZ2VQZXJmb3JtZWQodGV4dENoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZGlzcGxheVN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRBbm5vdGF0aW9uVG9UeXBlQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTkxYTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRBbm5vdGF0aW9uVG9UeXBlQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLklBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvVHlwZUNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0KLSAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3M7Ci0gICAgCi0gICAgcHVibGljIEFkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2xhc3MgPSBhbm5vdGF0aW9uQ2xhc3M7Ci0gICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIAotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotCi0gICAgICAgIElBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyID0gCi0gICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MpLgotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotICAgICAgICAKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycygKLSAgICAgICAgICAgICAgICBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCksIGFzdCwgYW5ub3RhdGlvbkNsYXNzKTsKLSAgICAgICAgCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgCi0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGNvbXBpbGF0aW9uVW5pdC5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgCi0gICAgICAgIEltcG9ydFJld3JpdGUgaW1wb3J0UmV3cml0ZSA9IENvZGVTdHlsZUNvbmZpZ3VyYXRpb24uY3JlYXRlSW1wb3J0UmV3cml0ZShjb21waWxhdGlvblVuaXQsIHRydWUpOwotICAgICAgICBpbXBvcnRSZXdyaXRlLmFkZEltcG9ydChhbm5vdGF0aW9uQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgIFRleHRFZGl0IGltcG9ydFRleHRFZGl0ID0gaW1wb3J0UmV3cml0ZS5yZXdyaXRlSW1wb3J0cyhudWxsKTsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChpbXBvcnRUZXh0RWRpdCk7ICAgICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9BZGRVbmltcGxlbWVudGVkTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzJhMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0FkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkltcG9ydFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuTGlzdFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5jb2RlbWFuaXB1bGF0aW9uLkNvZGVHZW5lcmF0aW9uU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5MjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuSmF2YVByZWZlcmVuY2VzU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0KLSAgICBwcml2YXRlIEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uOwotICAgIHByaXZhdGUgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlOwotCi0gICAgcHVibGljIEFkZFVuaW1wbGVtZW50ZWRNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0LCBBU1ROb2RlIHR5cGVEZWNsYXJhdGlvbiwgCi0gICAgICAgICAgICBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotICAgICAgICBzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0gICAgICAgIHRoaXMuZW5kcG9pbnRJbnRlcmZhY2UgPSBlbmRwb2ludEludGVyZmFjZTsKLSAgICAgICAgdGhpcy50eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJTWV0aG9kQmluZGluZ1tdIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHModHlwZURlY2xhcmF0aW9uLCBlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLSAgICAgICAgCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOwotICAgICAgICAKLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3QpOwotICAgICAgICAKLSAgICAgICAgQ29kZUdlbmVyYXRpb25TZXR0aW5ncyBzZXR0aW5ncyA9IEphdmFQcmVmZXJlbmNlc1NldHRpbmdzLmdldENvZGVHZW5lcmF0aW9uU2V0dGluZ3MoY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkpOwotICAgICAgICBzZXR0aW5ncy5vdmVycmlkZUFubm90YXRpb24gPSBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uID0gKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlRGVjbGFyYXRpb247Ci0gICAgICAgIExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlID0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUoYWJzdHJhY3RUeXBlRGVjbGFyYXRpb24sIAotICAgICAgICAgICAgICAgIGFic3RyYWN0VHlwZURlY2xhcmF0aW9uLmdldEJvZHlEZWNsYXJhdGlvbnNQcm9wZXJ0eSgpKTsKLSAKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gSW1wb3J0UmV3cml0ZS5jcmVhdGUoYXN0Um9vdCwgdHJ1ZSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmltcGxlbWVudGVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IHVuaW1wbGVtZW50ZWRNZXRob2RzW2ldOwotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSBTdHViVXRpbGl0eTIuY3JlYXRlSW1wbGVtZW50YXRpb25TdHViKGNvbXBpbGF0aW9uVW5pdCwgcmV3cml0ZXIsCi0gICAgICAgICAgICAgICAgICAgIGltcG9ydFJld3JpdGUsIGltcG9ydFJld3JpdGUuZ2V0RGVmYXVsdEltcG9ydFJld3JpdGVDb250ZXh0KCksIG1ldGhvZEJpbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCksIHNldHRpbmdzLCBmYWxzZSk7Ci0gICAgICAgICAgICBsaXN0UmV3cml0ZS5pbnNlcnRMYXN0KG1ldGhvZERlY2xhcmF0aW9uLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQocmV3cml0ZXIucmV3cml0ZUFTVCgpKTsKLSAgICAgICAgaWYgKGltcG9ydFJld3JpdGUuaGFzUmVjb3JkZWRDaGFuZ2VzKCkpIHsKLSAgICAgICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChpbXBvcnRSZXdyaXRlLnJld3JpdGVJbXBvcnRzKG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSU1ldGhvZEJpbmRpbmdbXSBnZXRNZXRob2RzVG9JbXBsZW1lbnQoKSB7Ci0gICAgICAgIHJldHVybiBnZXRVbmltcGxlbWVudGVkTWV0aG9kcyh0eXBlRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJTWV0aG9kQmluZGluZ1tdIGdldFVuaW1wbGVtZW50ZWRNZXRob2RzKEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2UpIHsKLSAgICAgICAgTGlzdDxJTWV0aG9kQmluZGluZz4gbWV0aG9kQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PElNZXRob2RCaW5kaW5nPigpOwotICAgICAgICBpZiAodHlwZURlY2xhcmF0aW9uLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICBDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb25Db21waWxhdGlvblVuaXQgPSAoQ29tcGlsYXRpb25Vbml0KSB0eXBlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21waWxhdGlvblVuaXQuZ2V0SmF2YUVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBpbXBsZW1lbnRhdGlvbkNvbXBpbGF0aW9uVW5pdC5nZXRKYXZhRWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlaSA9IHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgc2VpQ29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNlaSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBpbXBsZW1lbnRhdGlvbk1ldGhvZHMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uQ29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWV0aG9kRGVjbGFyYXRpb24+IHNlaU1ldGhvZHMgPSBnZXRNZXRob2REZWNsYXJhdGlvbnMoc2VpQ29tcGlsYXRpb25Vbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gc2VpTWV0aG9kIDogc2VpTWV0aG9kcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW1wbGVtZW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZERlY2xhcmF0aW9uIGltcGxNZXRob2QgOiBpbXBsZW1lbnRhdGlvbk1ldGhvZHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmNvbXBhcmVNZXRob2RzKHNlaU1ldGhvZCwgaW1wbE1ldGhvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltcGxlbWVudGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEJpbmRpbmdzLmFkZChzZWlNZXRob2QucmVzb2x2ZUJpbmRpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2RCaW5kaW5ncy50b0FycmF5KG5ldyBJTWV0aG9kQmluZGluZ1ttZXRob2RCaW5kaW5ncy5zaXplKCldKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICBmaW5hbCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbnMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb25zOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0YzdlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLSAgICAKLSAgICBwcml2YXRlIElCaW5kaW5nIGJpbmRpbmc7Ci0gICAgcHJpdmF0ZSBpbnQgaW5jbHVkZWRNb2RpZmllcnM7Ci0gICAgcHJpdmF0ZSBpbnQgZXhjbHVkZWRNb2RpZmllcnM7Ci0gICAgCi0gICAgCi0gICAgcHVibGljIENoYW5nZU1vZGlmaWVyQ29ycmVjdGlvblByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCwgSUJpbmRpbmcgYmluZGluZywgCi0gICAgICAgICAgICBpbnQgaW5jbHVkZWRNb2RpZmllcnMsIGludCBleGNsdWRlZE1vZGlmaWVycywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKLSAgICAgICAgdGhpcy5pbmNsdWRlZE1vZGlmaWVycyA9IGluY2x1ZGVkTW9kaWZpZXJzOwotICAgICAgICB0aGlzLmV4Y2x1ZGVkTW9kaWZpZXJzID0gZXhjbHVkZWRNb2RpZmllcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLQotICAgICAgICBBU1ROb2RlIGRlY2xhcmluZ05vZGUgPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKGJpbmRpbmcpOwotICAgICAgICAKLSAgICAgICAgaW50IGNvbnNpZGVyZWRNb2RpZmllckZsYWdzID0gaW5jbHVkZWRNb2RpZmllcnMgfCBleGNsdWRlZE1vZGlmaWVyczsgCi0gICAgICAgIGludCBuZXdNb2RpZmllckZsYWdzID0gaW5jbHVkZWRNb2RpZmllcnMgJiBjb25zaWRlcmVkTW9kaWZpZXJGbGFnczsKLQotICAgICAgICBMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZSA9IGdldExpc3RSZXdyaXRlKGRlY2xhcmluZ05vZGUsIHJld3JpdGVyKTsKLSAgICAgICAgaWYgKGxpc3RSZXdyaXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QVNUTm9kZT4gb3JpZ2luYWxMaXN0ID0gbGlzdFJld3JpdGUuZ2V0T3JpZ2luYWxMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKEFTVE5vZGUgYXN0Tm9kZSA6IG9yaWdpbmFsTGlzdCkgewotICAgICAgICAgICAgICAgIGlmIChhc3ROb2RlIGluc3RhbmNlb2YgTW9kaWZpZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgTW9kaWZpZXIgbW9kaWZpZXIgPSAoTW9kaWZpZXIpIGFzdE5vZGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllckZsYWcgPSBtb2RpZmllci5nZXRLZXl3b3JkKCkudG9GbGFnVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjb25zaWRlcmVkTW9kaWZpZXJGbGFncyAmIG1vZGlmaWVyRmxhZykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuZXdNb2RpZmllckZsYWdzICYgbW9kaWZpZXJGbGFnKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUucmVtb3ZlKG1vZGlmaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vZGlmaWVyRmxhZ3MgJj0gfm1vZGlmaWVyRmxhZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgTGlzdDxNb2RpZmllcj4gbW9kaWZlcnMgPSBhc3QubmV3TW9kaWZpZXJzKG5ld01vZGlmaWVyRmxhZ3MpOwotICAgICAgICAgICAgQVNUTm9kZSBsYXN0QW5ub3RhdGlvbiA9IGdldExhc3RBbm5vdGF0aW9uKGxpc3RSZXdyaXRlKTsKLSAgICAgICAgICAgIGZvciAoTW9kaWZpZXIgbW9kaWZpZXIgOiBtb2RpZmVycykgewotICAgICAgICAgICAgICAgIGludCBtb2RpZmllckZsYWcgPSBtb2RpZmllci5nZXRLZXl3b3JkKCkudG9GbGFnVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG1vZGlmaWVyRmxhZyAmIChNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUklWQVRFIHwgTW9kaWZpZXIuUFJPVEVDVEVEKSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFJld3JpdGUuaW5zZXJ0QWZ0ZXIobW9kaWZpZXIsIGxhc3RBbm5vdGF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCWxpc3RSZXdyaXRlLmluc2VydEZpcnN0KG1vZGlmaWVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGV4dENoYW5nZS5hZGRFZGl0KHJld3JpdGVyLnJld3JpdGVBU1QoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBBU1ROb2RlIGdldExhc3RBbm5vdGF0aW9uKExpc3RSZXdyaXRlIGxpc3RSZXdyaXRlKSB7Ci0gICAgICAgIEFTVE5vZGUgbGFzdEFubm90YXRpb24gPSBudWxsOwotICAgICAgICBMaXN0PEFTVE5vZGU+IHJld3JpdHRlbkxpc3QgPSBsaXN0UmV3cml0ZS5nZXRSZXdyaXR0ZW5MaXN0KCk7Ci0gICAgICAgIGZvciAoQVNUTm9kZSBhc3ROb2RlIDogcmV3cml0dGVuTGlzdCkgewotICAgICAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBJRXh0ZW5kZWRNb2RpZmllcikgewotICAgICAgICAgICAgICAgIElFeHRlbmRlZE1vZGlmaWVyIGV4dGVuZGVkTW9kaWZpZXIgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGFzdE5vZGU7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkTW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdEFubm90YXRpb24gPSBhc3ROb2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGFzdEFubm90YXRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdFJld3JpdGUgZ2V0TGlzdFJld3JpdGUoQVNUTm9kZSBhc3ROb2RlLCBBU1RSZXdyaXRlIGFzdFJld3JpdGUpIHsKLSAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIGFzdE5vZGU7Ci0gICAgICAgICAgICByZXR1cm4gYXN0UmV3cml0ZS5nZXRMaXN0UmV3cml0ZShtZXRob2REZWNsYXJhdGlvbiwgTWV0aG9kRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKSBhc3ROb2RlOwotICAgICAgICAgICAgcmV0dXJuIGFzdFJld3JpdGUuZ2V0TGlzdFJld3JpdGUodHlwZURlY2xhcmF0aW9uLCBUeXBlRGVjbGFyYXRpb24uTU9ESUZJRVJTMl9QUk9QRVJUWSk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9DaGFuZ2VSZXR1cm5UeXBlQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NmY1NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL0NoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5yZXdyaXRlLkFTVFJld3JpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuSW1wb3J0UmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuQ29kZVN0eWxlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotCQotCXByaXZhdGUgVHlwZURlY2xhcmF0aW9uIGltcGxUeXBlRGVjbGFyYXRpb247Ci0JcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBpbXBsTWV0aG9kRGVjbGFyYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kcG9pbnRJbnRlcmZhY2U7Ci0JCi0JcHVibGljIENoYW5nZVJldHVyblR5cGVDb3JyZWN0aW9uUHJvcG9zYWwoCi0JCQlJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIFR5cGVEZWNsYXJhdGlvbiBpbXBsVHlwZURlY2xhcmF0aW9uLCBNZXRob2REZWNsYXJhdGlvbiBpbXBsTWV0aG9kRGVjbGFyYXRpb24sIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsCi0JCQlpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotCQlzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0JICAgIHRoaXMuaW1wbFR5cGVEZWNsYXJhdGlvbiA9IGltcGxUeXBlRGVjbGFyYXRpb247Ci0JICAgIHRoaXMuaW1wbE1ldGhvZERlY2xhcmF0aW9uID0gaW1wbE1ldGhvZERlY2xhcmF0aW9uOwotCSAgICB0aGlzLmVuZHBvaW50SW50ZXJmYWNlID0gZW5kcG9pbnRJbnRlcmZhY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNZXRob2REZWNsYXJhdGlvbiBzZWlNZXRob2REZWNsYXJhdGlvbiA9IGdldFNFSU1ldGhvZERlY2xhcmF0aW9uKCk7Ci0JCWlmIChzZWlNZXRob2REZWNsYXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0gICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgIAotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgCi0gICAgICAgIEFTVCBhc3QgPSBhc3RSb290LmdldEFTVCgpOwotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgSVR5cGVCaW5kaW5nIHJldHVyblR5cGUgPSBzZWlNZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgSW1wb3J0UmV3cml0ZSBpbXBvcnRSZXdyaXRlID0gQ29kZVN0eWxlQ29uZmlndXJhdGlvbi5jcmVhdGVJbXBvcnRSZXdyaXRlKGNvbXBpbGF0aW9uVW5pdCwgdHJ1ZSk7Ci0gICAgICAgIFR5cGUgdHlwZSA9IGltcG9ydFJld3JpdGUuYWRkSW1wb3J0KHJldHVyblR5cGUsIGFzdCk7Ci0gICAgICAgIHJld3JpdGVyLnNldChpbXBsTWV0aG9kRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLlJFVFVSTl9UWVBFMl9QUk9QRVJUWSwgdHlwZSwgbnVsbCk7Ci0gICAgICAgIHJld3JpdGVyLnNldChpbXBsTWV0aG9kRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLkVYVFJBX0RJTUVOU0lPTlNfUFJPUEVSVFksIG5ldyBJbnRlZ2VyKDApLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgICAgICBpZiAoaW1wb3J0UmV3cml0ZS5oYXNSZWNvcmRlZENoYW5nZXMoKSkgewotICAgICAgICAJdGV4dENoYW5nZS5hZGRFZGl0KGltcG9ydFJld3JpdGUucmV3cml0ZUltcG9ydHMobnVsbCkpOwotICAgICAgICB9Ci0JfQotCi0gICAgcHJpdmF0ZSBNZXRob2REZWNsYXJhdGlvbiBnZXRTRUlNZXRob2REZWNsYXJhdGlvbigpIHsKLSAgICAgICAgaWYgKGltcGxUeXBlRGVjbGFyYXRpb24uZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgIENvbXBpbGF0aW9uVW5pdCBpbXBsQ29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgaW1wbFR5cGVEZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChpbXBsQ29tcGlsYXRpb25Vbml0LmdldEphdmFFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gaW1wbENvbXBpbGF0aW9uVW5pdC5nZXRKYXZhRWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIElUeXBlIHNlaVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShlbmRwb2ludEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoc2VpVHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlaUNvbXBpbGF0aW9uVW5pdCA9IHNlaVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgc2VpQVNUUm9vdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzZWlDb21waWxhdGlvblVuaXQsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZXRob2REZWNsYXJhdGlvbj4gc2VpTWV0aG9kRGVjbGFyYXRpb25zID0gZ2V0TWV0aG9kRGVjbGFyYXRpb25zKHNlaUFTVFJvb3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZXRob2REZWNsYXJhdGlvbiBzZWlNZXRob2REZWNsYXJhdGlvbiA6IHNlaU1ldGhvZERlY2xhcmF0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgCWlmIChBbm5vdGF0aW9uVXRpbHMuY29tcGFyZU1ldGhvZHMoaW1wbE1ldGhvZERlY2xhcmF0aW9uLCBzZWlNZXRob2REZWNsYXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIAkJcmV0dXJuIHNlaU1ldGhvZERlY2xhcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0JfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBnZXRNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICBmaW5hbCBMaXN0PE1ldGhvZERlY2xhcmF0aW9uPiBtZXRob2REZWNsYXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlY2xhcmF0aW9uPigpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0LmFjY2VwdChuZXcgQVNUVmlzaXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtZXRob2REZWNsYXJhdGlvbnMuYWRkKG1ldGhvZERlY2xhcmF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbWV0aG9kRGVjbGFyYXRpb25zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9KQVhXU1F1aWNrRml4UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vSkFYV1NRdWlja0ZpeFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWM3MzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9KQVhXU1F1aWNrRml4UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXguandzLk9uZXdheTsKLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBNZXNzYWdlSGFuZGxlcnM7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkVjbGlwc2VNZXNzYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5KYXZhRWxlbWVudEltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JUHJvYmxlbUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSVF1aWNrRml4UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKHsgInJlc3RyaWN0aW9uIiwgImRlcHJlY2F0aW9uIiB9KQotcHVibGljIGNsYXNzIEpBWFdTUXVpY2tGaXhQcm9jZXNzb3IgaW1wbGVtZW50cyBJUXVpY2tGaXhQcm9jZXNzb3IgewotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29ycmVjdGlvbnMoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBpbnQgcHJvYmxlbUlkKSB7Ci0gICAgICAgIGlmIChwcm9ibGVtSWQgPT0gRWNsaXBzZU1lc3NhZ2VyLkFQVF9RVUlDS19GSVhfUFJPQkxFTV9JRCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldENvcnJlY3Rpb25zKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uW10gbG9jYXRpb25zKQotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgaWYgKGxvY2F0aW9ucyA9PSBudWxsIHx8IGxvY2F0aW9ucy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPigpOwotCi0gICAgICAgIFNldDxTdHJpbmc+IGhhbmRsZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24gOiBsb2NhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHByb2JsZW1Bcmd1bWVudHMgPSBwcm9ibGVtTG9jYXRpb24uZ2V0UHJvYmxlbUFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKHByb2JsZW1Bcmd1bWVudHMubGVuZ3RoID49IDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvYmxlbSA9IHByb2JsZW1Bcmd1bWVudHNbMV07Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZWQuYWRkKHByb2JsZW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcm9wb3NhbHMudG9BcnJheShuZXcgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBwcm9ibGVtID0gcHJvYmxlbUxvY2F0aW9uLmdldFByb2JsZW1Bcmd1bWVudHMoKVsxXTsKLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX01VU1RfSU1QTEVNRU5UKSkgewotICAgICAgICAgICAgYWRkVW5pbXBsZW1lbnRlZE1ldGhvZHNQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfU1VQUE9SVEVEX09OX0NMQVNTRVNfV0lUSF9XRUJTRVJWSUNFKSkgewotICAgICAgICAgICAgYWRkQW5ub3RhdGlvblRvVHlwZVByb3Bvc2FsKGNvbnRleHQsIHByb3Bvc2FscywgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX05BTUVfQVRUUklCVVRFKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfUE9SVE5BTUVfU0VJKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfU0VSVklDRU5BTUVfU0VJKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5EUE9JTlRJTlRFUkZBQ0VfU0VJKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZU1lbWJlclZhbHVlUGFpclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX0VYQ0xVREVfU1BFQ0lGSUVEX05PX09USEVSX0FUVFJJQlVURVNfQUxMT1dFRCkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZU1lbWJlclZhbHVlUGFpclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCTUVUSE9EUykpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfTk9fUlBDX1NUWUxFX09OX01FVEhPRFMpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxUKSkgewotICAgICAgICAgICAgYWRkUmVtb3ZlQW5ub3RhdGlvblByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCBXZWJSZXN1bHQuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19XRUJQQVJBTSkpIHsKLSAgICAgICAgICAgIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19PTkVXQVkpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIE9uZXdheS5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUwpKSB7Ci0gICAgICAgICAgICBhZGRDaGFuZ2VNb2RpZmllclByb3Bvc2FsKGNvbnRleHQsIHByb2JsZW1Mb2NhdGlvbiwgcHJvcG9zYWxzLCA1KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0RFRkFVTFRfUFVCTElDX0NPTlNUUlVDVE9SKSkgewotICAgICAgICAgICAgYWRkQ29uc3RydWN0b3JQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT04pKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFdlYlNlcnZpY2VQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuSEFORExFUl9DSEFJTl9TT0FQX01FU1NBR0VfSEFORExFUlMpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFNPQVBNZXNzYWdlSGFuZGxlcnMuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUpKSB7Ci0gICAgICAgICAgICBhZGRSZW1vdmVNZXRob2RQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2Fscyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX09OTFlfT05fUFVCTElDX01FVEhPRFMpCi0gICAgICAgICAgICAgICAgfHwgcHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKQotICAgICAgICAgICAgICAgIHx8IHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19GSU5BTF9NT0RJRklFUl9BTExPV0VEKSkgewotICAgICAgICAgICAgYWRkQ2hhbmdlTW9kaWZpZXJQcm9wb3NhbChjb250ZXh0LCBwcm9ibGVtTG9jYXRpb24sIHByb3Bvc2FscywgNSk7Ci0gICAgICAgICAgICBhZGRSZW1vdmVBbm5vdGF0aW9uUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIFdlYk1ldGhvZC5jbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX1JFRFVDRURfVklTSUJJTElUWSkpIHsKLSAgICAgICAgICAgIGFkZENoYW5nZU1vZGlmaWVyUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMsIDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9JTkNPTVBBVElCTEVfUkVUVVJOX1RZUEUpKSB7Ci0gICAgICAgICAgICBhZGRDaGFuZ2VSZXR1cm5UeXBlUHJvcG9zYWwoY29udGV4dCwgcHJvYmxlbUxvY2F0aW9uLCBwcm9wb3NhbHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFubm90YXRpb25Ub1R5cGVQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzLAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotCi0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkFERF9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLSAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKYXZhUGx1Z2luSW1hZ2VzLmdldChKYXZhUGx1Z2luSW1hZ2VzLklNR19DT1JSRUNUSU9OX0NIQU5HRSk7Ci0gICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IEFkZEFubm90YXRpb25Ub1R5cGVDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgYW5ub3RhdGlvbkNsYXNzLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRSZW1vdmVNZXRob2RQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMpIHsKLQotICAgICAgICBBU1ROb2RlIHNlbGVjdGVkTm9kZSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRDb3ZlcmluZ05vZGUoY29udGV4dC5nZXRBU1RSb290KCkpOwotCi0gICAgICAgIGlmIChzZWxlY3RlZE5vZGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgc2VsZWN0ZWROb2RlLmdldFBhcmVudCgpOwotICAgICAgICAgICAgQVNUTm9kZSBwYXJlbnROb2RlID0gbm9ybWFsQW5ub3RhdGlvbi5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBwYXJlbnROb2RlKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gPSAoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSAoKE1ldGhvZERlY2xhcmF0aW9uKSBzaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uLmdldFBhcmVudCgpKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgU2ltcGxlTmFtZSkgewotICAgICAgICAgICAgU2ltcGxlTmFtZSBtZXRob2ROYW1lID0gKFNpbXBsZU5hbWUpIHNlbGVjdGVkTm9kZTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9NRVRIT0QsIG1ldGhvZE5hbWUuZ2V0SWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSk7Ci0KLSAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IFJlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCBtZXRob2ROYW1lLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlbW92ZUFubm90YXRpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uKSB7Ci0KLSAgICAgICAgQVNUTm9kZSBjb3ZlcmluZ05vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGNvbnRleHQuZ2V0QVNUUm9vdCgpKTsKLSAgICAgICAgQVNUTm9kZSBwYXJlbnROb2RlID0gY292ZXJpbmdOb2RlLmdldFBhcmVudCgpOwotCi0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9BTk5PVEFUSU9OLCBhbm5vdGF0aW9uLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIEltYWdlIGltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSk7Ci0gICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IFJlbW92ZUFubm90YXRpb25Db3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgYW5ub3RhdGlvbiwgcGFyZW50Tm9kZSwgZGlzcGxheVN0cmluZywgNSwgaW1hZ2UpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkUmVtb3ZlTWVtYmVyVmFsdWVQYWlyUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzLCBib29sZWFuIHJlbW92ZUFsbE90aGVyTVZQcykgewotCi0gICAgICAgIEFTVE5vZGUgY292ZXJpbmdOb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShjb250ZXh0LmdldEFTVFJvb3QoKSk7Ci0KLSAgICAgICAgaWYgKGNvdmVyaW5nTm9kZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIE1lbWJlclZhbHVlUGFpcikgewotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IChNZW1iZXJWYWx1ZVBhaXIpIGNvdmVyaW5nTm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9NRU1CRVJWQUxVRVBBSVIsIG1lbWJlclZhbHVlUGFpcgotICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZW1vdmVBbGxPdGhlck1WUHMpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLlJFTU9WRV9BTExfT1RIRVJfTUVNQkVSVkFMVUVQQUlSUzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSk7Ci0gICAgICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBSZW1vdmVNZW1iZXJWYWx1ZVBhaXJDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgbWVtYmVyVmFsdWVQYWlyLAotICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGxPdGhlck1WUHMsIGRpc3BsYXlTdHJpbmcsIDUsIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkVW5pbXBsZW1lbnRlZE1ldGhvZHNQcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2JsZW1Mb2NhdGlvbiBwcm9ibGVtTG9jYXRpb24sCi0gICAgICAgICAgICBMaXN0PElKYXZhQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMpIHsKLQotICAgICAgICBBU1ROb2RlIGVuZHBvaW50SW50ZXJmYWNlVmFsdWUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGNvbnRleHQuZ2V0QVNUUm9vdCgpKTsKLSAgICAgICAgaWYgKGVuZHBvaW50SW50ZXJmYWNlVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdMaXRlcmFsKSB7Ci0gICAgICAgICAgICBBU1ROb2RlIGVuZHBvaW50SW50ZXJmYWNlTVZQID0gZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIEFTVE5vZGUgd2ViU2VydmljZUFubm90YXRpb24gPSBlbmRwb2ludEludGVyZmFjZU1WUC5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIEFTVE5vZGUgdHlwZURlY2xhcmF0aW9uID0gd2ViU2VydmljZUFubm90YXRpb24uZ2V0UGFyZW50KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBlbmRwb2ludEludGVyZmFjZSA9ICgoU3RyaW5nTGl0ZXJhbCkgZW5kcG9pbnRJbnRlcmZhY2VWYWx1ZSkuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9DSEFOR0UpOwotICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQWRkVW5pbXBsZW1lbnRlZE1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbChjb250ZXh0LCB0eXBlRGVjbGFyYXRpb24sIGVuZHBvaW50SW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuQUREX1VOSU1QTEVNRU5URURfTUVUSE9EUywgNSwgaW1hZ2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRDaGFuZ2VNb2RpZmllclByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscywgaW50IHJlbGV2YW5jZSkgewotCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gY29udGV4dC5nZXRBU1RSb290KCk7Ci0gICAgICAgIEFTVE5vZGUgc2VsZWN0ZWROb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShhc3RSb290KTsKLQotICAgICAgICBpZiAoIShzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9ICgoU2ltcGxlTmFtZSkgc2VsZWN0ZWROb2RlKS5yZXNvbHZlQmluZGluZygpOwotICAgICAgICBpZiAoYmluZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYmluZGluZ05hbWUgPSBiaW5kaW5nLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7Ci0KLSAgICAgICAgICAgIGludCBleGNsdWRlZE1vZGlmaWVycyA9IDA7Ci0gICAgICAgICAgICBpbnQgaW5jbHVkZWRNb2RpZmllcnMgPSAwOwotCi0gICAgICAgICAgICBTdHJpbmcgcHJvYmxlbSA9IHByb2JsZW1Mb2NhdGlvbi5nZXRQcm9ibGVtQXJndW1lbnRzKClbMV07Ci0KLSAgICAgICAgICAgIGlmKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTKQotICAgICAgICAgICAgICAgICAgICB8fCBwcm9ibGVtLmVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfUkVEVUNFRF9WSVNJQklMSVRZKSkgewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTW9kaWZpZXJzID0gfihNb2RpZmllci5QVUJMSUMpOwotICAgICAgICAgICAgICAgIGluY2x1ZGVkTW9kaWZpZXJzID0gTW9kaWZpZXIuUFVCTElDIDsKLSAgICAgICAgICAgICAgICBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkNIQU5HRV9NRVRIT0RfVklTSUJJTElUWSwgInB1YmxpYyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHByb2JsZW0uZXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19GSU5BTF9NT0RJRklFUl9BTExPV0VEKSkgewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTW9kaWZpZXJzID0gTW9kaWZpZXIuRklOQUw7Ci0gICAgICAgICAgICAgICAgZGlzcGxheVN0cmluZyA9IEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5SRU1PVkVfRklOQUxfTU9ESUZJRVIsIGJpbmRpbmdOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEKSkgewotICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTW9kaWZpZXJzID0gTW9kaWZpZXIuU1RBVElDOwotICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX1NUQVRJQ19NT0RJRklFUiwgYmluZGluZ05hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocHJvYmxlbS5lcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUwpKSB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZWRNb2RpZmllcnMgPSBNb2RpZmllci5BQlNUUkFDVCB8IE1vZGlmaWVyLkZJTkFMOwotICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcgPSBKQVhXU1VJTWVzc2FnZXMuUkVNT1ZFX0lMTEVHQUxfTU9ESUZJRVI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEltYWdlIGltYWdlID0gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9DSEFOR0UpOwotICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQ2hhbmdlTW9kaWZpZXJDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgYmluZGluZywgaW5jbHVkZWRNb2RpZmllcnMsCi0gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVkTW9kaWZpZXJzLCBkaXNwbGF5U3RyaW5nLCA1LCBpbWFnZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZENvbnN0cnVjdG9yUHJvcG9zYWwoSUludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ibGVtTG9jYXRpb24gcHJvYmxlbUxvY2F0aW9uLAotICAgICAgICAgICAgTGlzdDxJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbD4gcHJvcG9zYWxzLCBpbnQgcmVsZXZhbmNlKSB7Ci0KLSAgICAgICAgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBjb250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgQVNUTm9kZSBzZWxlY3RlZE5vZGUgPSBwcm9ibGVtTG9jYXRpb24uZ2V0Q292ZXJpbmdOb2RlKGFzdFJvb3QpOwotCi0gICAgICAgIElUeXBlQmluZGluZyB0eXBlQmluZGluZyA9ICgoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24pIHNlbGVjdGVkTm9kZS5nZXRQYXJlbnQoKSkucmVzb2x2ZUJpbmRpbmcoKTsKLSAgICAgICAgaWYgKHR5cGVCaW5kaW5nICE9IG51bGwgJiYgdHlwZUJpbmRpbmcuaXNGcm9tU291cmNlKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkNSRUFURV9DT05TVFJVQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgdHlwZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKYXZhRWxlbWVudEltYWdlUHJvdmlkZXIuZ2V0RGVjb3JhdGVkSW1hZ2UoSmF2YVBsdWdpbkltYWdlcy5ERVNDX01JU0NfUFVCTElDLAotICAgICAgICAgICAgICAgICAgICBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5DT05TVFJVQ1RPUiwgSmF2YUVsZW1lbnRJbWFnZVByb3ZpZGVyLlNNQUxMX1NJWkUpOwotCi0gICAgICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBOZXdEZWZhdWx0Q29uc3RydWN0b3JDb3JyZWN0aW9uUHJvcG9zYWwoY29udGV4dCwgdHlwZUJpbmRpbmcsIGRpc3BsYXlTdHJpbmcsIDUsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkQ2hhbmdlUmV0dXJuVHlwZVByb3Bvc2FsKElJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvYmxlbUxvY2F0aW9uIHByb2JsZW1Mb2NhdGlvbiwKLSAgICAgICAgICAgIExpc3Q8SUphdmFDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscykgewotCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gY29udGV4dC5nZXRBU1RSb290KCk7Ci0gICAgICAgIEFTVE5vZGUgc2VsZWN0ZWROb2RlID0gcHJvYmxlbUxvY2F0aW9uLmdldENvdmVyaW5nTm9kZShhc3RSb290KTsKLQotICAgICAgICBpZiAoIShzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBTaW1wbGVOYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gaW1wbE1ldGhvZERlY2xhcmF0aW9uID0gKE1ldGhvZERlY2xhcmF0aW9uKSgoU2ltcGxlTmFtZSkgc2VsZWN0ZWROb2RlKS5nZXRQYXJlbnQoKTsKLSAgICAgICAgVHlwZURlY2xhcmF0aW9uIGltcGxUeXBlRGVjbGFyYXRpb24gPSAoVHlwZURlY2xhcmF0aW9uKWltcGxNZXRob2REZWNsYXJhdGlvbi5nZXRQYXJlbnQoKTsKLQotICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihpbXBsVHlwZURlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCkuZ2V0SmF2YUVsZW1lbnQoKSwgV2ViU2VydmljZS5jbGFzcyk7Ci0KLSAgICAgICAgU3RyaW5nIGVuZHBvaW50SW50ZXJmYWNlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sICJlbmRwb2ludEludGVyZmFjZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gSkFYV1NVSU1lc3NhZ2VzLkNIQU5HRV9NRVRIT0RfUkVUVVJOX1RZUEU7Ci0gICAgICAgIEltYWdlIGltYWdlID0gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9DSEFOR0UpOwotICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBDaGFuZ2VSZXR1cm5UeXBlQ29ycmVjdGlvblByb3Bvc2FsKGNvbnRleHQsIGltcGxUeXBlRGVjbGFyYXRpb24sCi0gICAgICAgICAgICAgICAgaW1wbE1ldGhvZERlY2xhcmF0aW9uLCBlbmRwb2ludEludGVyZmFjZSwgZGlzcGxheVN0cmluZywgNSwgaW1hZ2UpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vTmV3RGVmYXVsdENvbnN0cnVjdG9yQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjA3MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL05ld0RlZmF1bHRDb25zdHJ1Y3RvckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQmxvY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGlsZExpc3RQcm9wZXJ0eURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuTGlzdFJld3JpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Db2RlR2VuZXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSW52b2NhdGlvbkNvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotDQotcHVibGljIGNsYXNzIE5ld0RlZmF1bHRDb25zdHJ1Y3RvckNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7DQotDQotCXByaXZhdGUgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOw0KLQkNCi0JcHVibGljIE5ld0RlZmF1bHRDb25zdHJ1Y3RvckNvcnJlY3Rpb25Qcm9wb3NhbCgNCi0JCQlJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsDQotCQkJaW50IHJlbGV2YW5jZSwgSW1hZ2UgaW1hZ2UpIHsNCi0JCXN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsNCi0JCXRoaXMudHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZzsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgIHB1YmxpYyB2b2lkIGFkZEVkaXRzKFRleHRGaWxlQ2hhbmdlIHRleHRDaGFuZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0QVNUUm9vdCgpOw0KLSAgICAgICAgQVNUIGFzdCA9IGFzdFJvb3QuZ2V0QVNUKCk7DQotICAgICAgICBBU1RSZXdyaXRlIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsNCi0NCi0JCUFTVE5vZGUgdHlwZURlY2xhcmF0aW9uID0gYXN0Um9vdC5maW5kRGVjbGFyaW5nTm9kZSh0eXBlQmluZGluZyk7DQotDQotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOw0KLQ0KLQkJU2ltcGxlTmFtZSBuZXdOYW1lTm9kZSA9IGFzdC5uZXdTaW1wbGVOYW1lKHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7DQotDQotCQltZXRob2REZWNsYXJhdGlvbi5zZXRDb25zdHJ1Y3Rvcih0cnVlKTsNCi0NCi0JCW1ldGhvZERlY2xhcmF0aW9uLm1vZGlmaWVycygpLmFkZEFsbChhc3QubmV3TW9kaWZpZXJzKE1vZGlmaWVyLlBVQkxJQykpOw0KLQ0KLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0TmFtZShuZXdOYW1lTm9kZSk7DQotDQotCQlCbG9jayBib2R5ID0gYXN0Lm5ld0Jsb2NrKCk7DQotDQotCQlTdHJpbmcgcGxhY2VIb2xkZXIgPSBDb2RlR2VuZXJhdGlvbi5nZXRNZXRob2RCb2R5Q29udGVudChpbnZvY2F0aW9uQ29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKSwNCi0gICAgICAgICAgICAgICAgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpLCBuZXdOYW1lTm9kZS5nZXRJZGVudGlmaWVyKCksIHRydWUsICIiLCBTdHJpbmcudmFsdWVPZignXG4nKSk7DQotCQlpZiAocGxhY2VIb2xkZXIgIT0gbnVsbCkgew0KLQkJICAgIEFTVE5vZGUgdG9kb05vZGUgPSByZXdyaXRlci5jcmVhdGVTdHJpbmdQbGFjZWhvbGRlcihwbGFjZUhvbGRlciwgQVNUTm9kZS5SRVRVUk5fU1RBVEVNRU5UKTsNCi0JCSAgICBib2R5LnN0YXRlbWVudHMoKS5hZGQodG9kb05vZGUpOw0KLQkJfQ0KLQkJbWV0aG9kRGVjbGFyYXRpb24uc2V0Qm9keShib2R5KTsNCi0JCQ0KLQkJQ2hpbGRMaXN0UHJvcGVydHlEZXNjcmlwdG9yIHByb3BlcnR5ID0gKChBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uKS5nZXRCb2R5RGVjbGFyYXRpb25zUHJvcGVydHkoKTsNCi0JCUxpc3Q8QVNUTm9kZT4gbWVtYmVycyA9IChMaXN0PEFTVE5vZGU+KSB0eXBlRGVjbGFyYXRpb24uZ2V0U3RydWN0dXJhbFByb3BlcnR5KHByb3BlcnR5KTsNCi0JCUxpc3RJdGVyYXRvcjxBU1ROb2RlPiBtZW1iZXJzSXRlcmF0b3IgPSBtZW1iZXJzLmxpc3RJdGVyYXRvcigpOw0KLQkJaW50IGluc2VydEF0ID0gMDsNCi0JCXdoaWxlIChtZW1iZXJzSXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgew0KLQkJCUFTVE5vZGUgYXN0Tm9kZSA9IChBU1ROb2RlKSBtZW1iZXJzSXRlcmF0b3IucHJldmlvdXMoKTsNCi0JCQlpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICYmICgoTWV0aG9kRGVjbGFyYXRpb24pIGFzdE5vZGUpLmlzQ29uc3RydWN0b3IoKSkgew0KLQkJCQlpbnNlcnRBdCA9IG1lbWJlcnNJdGVyYXRvci5wcmV2aW91c0luZGV4KCkgKyAxOw0KLQkJCX0NCi0JCX0NCi0JCUxpc3RSZXdyaXRlIGxpc3RSZXdyaXRlcj0gcmV3cml0ZXIuZ2V0TGlzdFJld3JpdGUodHlwZURlY2xhcmF0aW9uLCBwcm9wZXJ0eSk7DQotCQlsaXN0UmV3cml0ZXIuaW5zZXJ0QXQobWV0aG9kRGVjbGFyYXRpb24sIGluc2VydEF0LCBudWxsKTsNCi0JCXRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlQW5ub3RhdGlvbkNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzE2MmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uQ29ycmVjdGlvblByb3Bvc2FsIGV4dGVuZHMgQWJzdHJhY3RKYXZhQ29ycmVjdGlvblByb3Bzb2FsIHsKLQotICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb247Ci0gICAgcHJpdmF0ZSBBU1ROb2RlIHBhcmVudE5vZGU7Ci0KLSAgICBwdWJsaWMgUmVtb3ZlQW5ub3RhdGlvbkNvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiwgQVNUTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLSAgICAgICAgICAgIGludCByZWxldmFuY2UsIEltYWdlIGltYWdlKSB7Ci0gICAgICAgIHN1cGVyKGludm9jYXRpb25Db250ZXh0LCBkaXNwbGF5U3RyaW5nLCByZWxldmFuY2UsIGltYWdlKTsKLSAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLSAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRFZGl0cyhUZXh0RmlsZUNoYW5nZSB0ZXh0Q2hhbmdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFTVFJld3JpdGUgcmV3cml0ZXIgPSBBU1RSZXdyaXRlLmNyZWF0ZShwYXJlbnROb2RlLmdldEFTVCgpKTsKLQotICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLSAgICAgICAgICAgIEFubm90YXRpb24gamR0RG9tQW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBwYXJlbnROb2RlOwotICAgICAgICAgICAgcmV3cml0ZXIucmVtb3ZlKGpkdERvbUFubm90YXRpb24sIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBhcmVudE5vZGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikgewotICAgICAgICAgICAgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gPSAoTWV0aG9kRGVjbGFyYXRpb24pIHBhcmVudE5vZGU7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIGpkdERvbUFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihtZXRob2REZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpLmdldEphdmFFbGVtZW50KCksIGFubm90YXRpb24pOwotICAgICAgICAgICAgaWYgKGpkdERvbUFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVyLnJlbW92ZShqZHREb21Bbm5vdGF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnROb2RlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSB7Ci0gICAgICAgICAgICBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbikgcGFyZW50Tm9kZS5nZXRQYXJlbnQoKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gamR0RG9tQW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGVEZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpLmdldEphdmFFbGVtZW50KCksIGFubm90YXRpb24pOwotICAgICAgICAgICAgaWYgKGpkdERvbUFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJld3JpdGVyLnJlbW92ZShqZHREb21Bbm5vdGF0aW9uLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFlYzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvY29ycmVjdGlvbi9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJDb3JyZWN0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuY29ycmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUludm9jYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbCBleHRlbmRzIEFic3RyYWN0SmF2YUNvcnJlY3Rpb25Qcm9wc29hbCB7Ci0gICAgCi0gICAgcHJpdmF0ZSBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyOwotICAgIHByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxPdGhlck1WUHM7Ci0gICAgCi0gICAgcHVibGljIFJlbW92ZU1lbWJlclZhbHVlUGFpckNvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyLCBib29sZWFuIHJlbW92ZUFsbE90aGVyTVZQcywgU3RyaW5nIGRpc3BsYXlTdHJpbmcsIGludCByZWxldmFuY2UsIAotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UpIHsKLSAgICAgICAgc3VwZXIoaW52b2NhdGlvbkNvbnRleHQsIGRpc3BsYXlTdHJpbmcsIHJlbGV2YW5jZSwgaW1hZ2UpOwotICAgICAgICB0aGlzLm1lbWJlclZhbHVlUGFpciA9IG1lbWJlclZhbHVlUGFpcjsKLSAgICAgICAgdGhpcy5yZW1vdmVBbGxPdGhlck1WUHMgPSByZW1vdmVBbGxPdGhlck1WUHM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFBhcmVudCgpIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIG1lbWJlclZhbHVlUGFpci5nZXRQYXJlbnQoKTsKLQotICAgICAgICAgICAgQVNUUmV3cml0ZSBhc3RSZXdyaXRlID0gQVNUUmV3cml0ZS5jcmVhdGUoYW5ub3RhdGlvbi5nZXRBU1QoKSk7Ci0gICAgICAgICAgICBpZiAocmVtb3ZlQWxsT3RoZXJNVlBzKSB7Ci0gICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBhbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG90aGVyTWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIW90aGVyTWVtYmVyVmFsdWVQYWlyLmVxdWFscyhtZW1iZXJWYWx1ZVBhaXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3RSZXdyaXRlLnJlbW92ZShvdGhlck1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzdFJld3JpdGUucmVtb3ZlKG1lbWJlclZhbHVlUGFpciwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXh0Q2hhbmdlLmFkZEVkaXQoYXN0UmV3cml0ZS5yZXdyaXRlQVNUKCkpOyAgIAotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2NvcnJlY3Rpb24vUmVtb3ZlTWV0aG9kQ29ycmVjdGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjgwNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9jb3JyZWN0aW9uL1JlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLklJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVNZXRob2RDb3JyZWN0aW9uUHJvcG9zYWwgZXh0ZW5kcyBBYnN0cmFjdEphdmFDb3JyZWN0aW9uUHJvcHNvYWwgewotCi0gICAgcHJpdmF0ZSBTaW1wbGVOYW1lIG1ldGhvZE5hbWU7Ci0gICAgCi0gICAgcHVibGljIFJlbW92ZU1ldGhvZENvcnJlY3Rpb25Qcm9wb3NhbChJSW52b2NhdGlvbkNvbnRleHQgaW52b2NhdGlvbkNvbnRleHQsIFNpbXBsZU5hbWUgbWV0aG9kTmFtZSwKLSAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBpbnQgcmVsZXZhbmNlLCBJbWFnZSBpbWFnZSkgewotICAgICAgICBzdXBlcihpbnZvY2F0aW9uQ29udGV4dCwgZGlzcGxheVN0cmluZywgcmVsZXZhbmNlLCBpbWFnZSk7Ci0gICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRWRpdHMoVGV4dEZpbGVDaGFuZ2UgdGV4dENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbWV0aG9kTmFtZS5yZXNvbHZlQmluZGluZygpOwotICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IGludm9jYXRpb25Db250ZXh0LmdldEFTVFJvb3QoKTsKLSAgICAgICAgSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9ICgoSU1ldGhvZEJpbmRpbmcpIGJpbmRpbmcpLmdldE1ldGhvZERlY2xhcmF0aW9uKCk7Ci0gICAgICAgIEFTVE5vZGUgZGVjbGFyYXRpb24gPSBhc3RSb290LmZpbmREZWNsYXJpbmdOb2RlKG1ldGhvZEJpbmRpbmcpOwotICAgICAgICBBU1QgYXN0ID0gYXN0Um9vdC5nZXRBU1QoKTsKLSAgICAgICAgQVNUUmV3cml0ZSByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIHJld3JpdGVyLnJlbW92ZShkZWNsYXJhdGlvbiwgbnVsbCk7Ci0gICAgICAgIHRleHRDaGFuZ2UuYWRkRWRpdChyZXdyaXRlci5yZXdyaXRlQVNUKCkpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9CaW5kaW5nVHlwZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YTFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVkFMVUU7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLWltcG9ydCBqYXZheC54bWwud3MuaHR0cC5IVFRQQmluZGluZzsNCi1pbXBvcnQgamF2YXgueG1sLndzLnNvYXAuU09BUEJpbmRpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3R5bGVkU3RyaW5nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi1wdWJsaWMgY2xhc3MgQmluZGluZ1R5cGVBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7DQotDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0FQQmluZGluZ19TT0FQMTFIVFRQX0JJTkRJTkcgPSAiU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUEJpbmRpbmdfU09BUDEySFRUUF9CSU5ESU5HID0gIlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORyI7IC8vJE5PTi1OTFMtMSQNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPQVBCaW5kaW5nX1NPQVAxMUhUVFBfTVRPTV9CSU5ESU5HID0gIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUEJpbmRpbmdfU09BUDEySFRUUF9NVE9NX0JJTkRJTkcgPSAiU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkciOyAvLyROT04tTkxTLTEkDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQQmluZGluZ19IVFRQX0JJTkRJTkcgPSAiSFRUUEJpbmRpbmcuSFRUUF9CSU5ESU5HIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9CSU5ESU5HID0gImphdmF4LnhtbC53cy5zb2FwLlNPQVBCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9CSU5ESU5HID0gImphdmF4LnhtbC53cy5odHRwLkhUVFBCaW5kaW5nIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLSAgICBwdWJsaWMgQmluZGluZ1R5cGVBdHRyaWJ1dGVJbml0aWFsaXplcigpIHsNCi0gICAgICAgIEpBWFdTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKS5wdXQoU09BUF9CSU5ESU5HLA0KLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiaWNvbnMvb2JqMTYvc29hcGJpbmRpbmdfb2JqLmdpZiIpLmNyZWF0ZUltYWdlKCkpOyAvLyROT04tTkxTLTEkDQotICAgICAgICBKQVhXU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KEhUVFBfQklORElORywNCi0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImljb25zL29iajE2L2h0dHBiaW5kaW5nX29iai5naWYiKS5jcmVhdGVJbWFnZSgpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LA0KLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsNCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7DQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgew0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciB2YWx1ZSA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBWQUxVRSwgZ2V0RGVmYXVsdCgpKTsgLy8kTk9OLU5MUy0xJA0KLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHZhbHVlKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOw0KLSAgICB9DQotDQotICAgIEBPdmVycmlkZQ0KLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsDQotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7DQotICAgICAgICBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7DQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgew0KLSAgICAgICAgICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKTsNCi0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgIGFkZFF1YWxpZmllZE5hbWVCaW5kaW5nc0NvbXBsZXRpb25Qcm9wb3NhbHMoY29tcGxldGlvblByb3Bvc2FscywgZXhwcmVzc2lvbik7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsNCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsNCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7DQotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7DQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsNCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVkFMVUUpKSB7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmVxdWFscyhNSVNTSU5HX0lERU5USUZFUikgfHwgdmFsdWUuY2hhckF0KDApICE9ICdcIicpIHsNCi0gICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBnZXRTaG9ydE5hbWVCaW5kaW5nc01hcCgpOw0KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPj4gYmluZGluZ3NJdGVyID0gYmluZGluZ3MuZW50cnlTZXQoKS5pdGVyYXRvcigpOw0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJpbmRpbmdzSXRlci5oYXNOZXh0KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdFbnRyeSA9IGJpbmRpbmdzSXRlci5uZXh0KCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3Bvc2FsID0gYmluZGluZ0VudHJ5LmdldEtleSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lID0gYmluZGluZ0VudHJ5LmdldFZhbHVlKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlcGxhY2VtZW50T2Zmc2V0ID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkuZ2V0U3RhcnRQb3NpdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXBsYWNlbWVudExlbmd0aCA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLmdldExlbmd0aCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlIGltYWdlID0gSkFYV1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChuZXcgQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBpbWFnZSwgbmV3IFN0eWxlZFN0cmluZyhwcm9wb3NhbCksIDUsDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgYWRkUXVhbGlmaWVkTmFtZUJpbmRpbmdzQ29tcGxldGlvblByb3Bvc2Fscyhjb21wbGV0aW9uUHJvcG9zYWxzLCBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFF1YWxpZmllZE5hbWVCaW5kaW5nc0NvbXBsZXRpb25Qcm9wb3NhbHMoTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzLCBFeHByZXNzaW9uIHZhbHVlKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzID0gZ2V0UXVhbGlmaWVkTmFtZUJpbmRpbmdzTWFwKCk7DQotICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+PiBiaW5kaW5nc0l0ZXIgPSBiaW5kaW5ncy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7DQotICAgICAgICB3aGlsZSAoYmluZGluZ3NJdGVyLmhhc05leHQoKSkgew0KLSAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gYmluZGluZ0VudHJ5ID0gYmluZGluZ3NJdGVyLm5leHQoKTsNCi0gICAgICAgICAgICBTdHJpbmcgcHJvcG9zYWwgPSBiaW5kaW5nRW50cnkuZ2V0S2V5KCk7DQotICAgICAgICAgICAgSW1hZ2UgaW1hZ2UgPSBKQVhXU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGJpbmRpbmdFbnRyeS5nZXRWYWx1ZSgpKTsNCi0gICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwsIHZhbHVlLCBpbWFnZSwgZ2V0RGlzcGxheVN0cmluZyhwcm9wb3NhbCkpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7DQotICAgICAgICByZXR1cm4gU09BUEJpbmRpbmcuU09BUDExSFRUUF9CSU5ESU5HOw0KLSAgICB9DQotDQotICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoU3RyaW5nIGJpbmRpbmcpIHsNCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMUhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTJIVFRQX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfQklORElORzsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChiaW5kaW5nLmVxdWFscyhTT0FQQmluZGluZy5TT0FQMTFIVFRQX01UT01fQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gU09BUEJpbmRpbmdfU09BUDExSFRUUF9NVE9NX0JJTkRJTkc7DQotICAgICAgICB9DQotICAgICAgICBpZiAoYmluZGluZy5lcXVhbHMoU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkcpKSB7DQotICAgICAgICAgICAgcmV0dXJuIFNPQVBCaW5kaW5nX1NPQVAxMkhUVFBfTVRPTV9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGJpbmRpbmcuZXF1YWxzKEhUVFBCaW5kaW5nLkhUVFBfQklORElORykpIHsNCi0gICAgICAgICAgICByZXR1cm4gSFRUUEJpbmRpbmdfSFRUUF9CSU5ESU5HOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmc7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFF1YWxpZmllZE5hbWVCaW5kaW5nc01hcCgpIHsNCi0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYmluZGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dChTT0FQQmluZGluZy5TT0FQMTFIVFRQX0JJTkRJTkcsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoU09BUEJpbmRpbmcuU09BUDEySFRUUF9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KFNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfTVRPTV9CSU5ESU5HLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KEhUVFBCaW5kaW5nLkhUVFBfQklORElORywgSFRUUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIHJldHVybiBiaW5kaW5nczsNCi0gICAgfQ0KLQ0KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U2hvcnROYW1lQmluZGluZ3NNYXAoKSB7DQotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfQklORElORyIsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMkhUVFBfQklORElORyIsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7DQotICAgICAgICBiaW5kaW5ncy5wdXQoIlNPQVBCaW5kaW5nLlNPQVAxMUhUVFBfTVRPTV9CSU5ESU5HIiwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsNCi0gICAgICAgIGJpbmRpbmdzLnB1dCgiU09BUEJpbmRpbmcuU09BUDEySFRUUF9NVE9NX0JJTkRJTkciLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgYmluZGluZ3MucHV0KCJIVFRQQmluZGluZy5IVFRQX0JJTkRJTkciLCBIVFRQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpOw0KLSAgICAgICAgcmV0dXJuIGJpbmRpbmdzOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmZjA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL0JpbmRpbmdUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20ucmV3cml0ZS5JbXBvcnRSZXdyaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLkphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHlsZWRTdHJpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHsNCi0NCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmc7DQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7DQotICAgIA0KLSAgICBwdWJsaWMgQmluZGluZ1R5cGVDb21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwNCi0gICAgICAgICAgICBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgSW1hZ2UgaW1hZ2UsIFN0eWxlZFN0cmluZyBkaXNwbGF5U3RyaW5nLA0KLSAgICAgICAgICAgIGludCByZWxldmFuY2UsIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7DQotICAgICAgICBzdXBlcihyZXBsYWNlbWVudFN0cmluZywgY29tcGlsYXRpb25Vbml0LCByZXBsYWNlbWVudE9mZnNldCwgcmVwbGFjZW1lbnRMZW5ndGgsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCANCi0gICAgICAgIAkJcmVsZXZhbmNlLCBmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsNCi0gICAgICAgIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7DQotICAgICAgICB0aGlzLnJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50U3RyaW5nKElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0LCANCi0gICAgICAgICAgICBJbXBvcnRSZXdyaXRlIGltcG9ydFJld3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7DQotICAgIAkNCi0gICAgICAgIGlmIChpbXBvcnRSZXdyaXRlICE9IG51bGwgJiYgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSAhPSBudWxsICYmIHJlcGxhY2VtZW50U3RyaW5nICE9IG51bGwpIHsgICAgICAgIA0KLSAgICAgICAgCWlmIChmdWxseVF1YWxpZmllZFR5cGVOYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgew0KLSAgICAgICAgICAgICAgICBJVHlwZVtdIHR5cGVzPSBpbXBvcnRSZXdyaXRlLmdldENvbXBpbGF0aW9uVW5pdCgpLmdldFR5cGVzKCk7DQotICAgICAgICAgICAgICAgIGlmICh0eXBlcy5sZW5ndGggPiAwICYmIHR5cGVzWzBdLmdldFNvdXJjZVJhbmdlKCkuZ2V0T2Zmc2V0KCkgPD0gb2Zmc2V0KSB7DQotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGltcG9ydEFkZGVkID0gIWltcG9ydFJld3JpdGUuYWRkSW1wb3J0KGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpLmVxdWFscyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsNCi0gICAgICAgICAgICAgICAgICAgIGlmICghaW1wb3J0QWRkZWQpIHsNCi0gICAgICAgICAgICAgICAgICAgIAlzZXRSZXBsYWNlbWVudFN0cmluZyhmdWxseVF1YWxpZmllZFR5cGVOYW1lDQotCQkJCQkJCQkrIHJlcGxhY2VtZW50U3RyaW5nLnN1YnN0cmluZyhyZXBsYWNlbWVudFN0cmluZy5sYXN0SW5kZXhPZignLicpKSk7DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0QWRkZWQ7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gZmFsc2U7DQotICAgIH0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9SZXF1ZXN0V3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1JlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmNmQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1JlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5ET1RfQ0hBUkFDVEVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkpBWFdTX1NVQlBBQ0tBR0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTE9DQUxfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5PUEVSQVRJT05fTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLmluaXRpYWxpemF0aW9uLkFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS51dGlscy5KRFRVdGlsczsKLQotcHVibGljIGNsYXNzIFJlcXVlc3RXcmFwcGVyQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgY2xhc3NOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIENMQVNTX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIGdldENsYXNzTmFtZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGxvY2FsTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBMT0NBTF9OQU1FLAotICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbE5hbWUodHlwZSwgbWV0aG9kKSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAgICAgVEFSR0VUX05BTUVTUEFDRSwgZ2V0VGFyZ2V0TmFtZXNwYWNlKHR5cGUpKTsKLQotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoY2xhc3NOYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGxvY2FsTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXJzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBnZXRDb21wbGV0aW9uUHJvcG9zYWxzRm9yTWVtYmVyVmFsdWVQYWlyKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwKLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oMSk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKENMQVNTX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldENsYXNzTmFtZSh0eXBlLCBtZXRob2QpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhMT0NBTF9OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRMb2NhbE5hbWUodHlwZSwgbWV0aG9kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0VGFyZ2V0TmFtZXNwYWNlKHR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcGFja2FnZU5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcih0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICBpZiAocGFja2FnZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwYWNrYWdlTmFtZS5hcHBlbmQoRE9UX0NIQVJBQ1RFUik7ICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcGFja2FnZU5hbWUuYXBwZW5kKEpBWFdTX1NVQlBBQ0tBR0UpOwotICAgICAgICBwYWNrYWdlTmFtZS5hcHBlbmQoRE9UX0NIQVJBQ1RFUik7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlTmFtZS50b1N0cmluZygpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZSh0eXBlKSArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDEpICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoSVR5cGUgdHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MsIHR5cGUpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsICYmIHRhcmdldE5hbWVzcGFjZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1Jlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1Jlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDAzNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9SZXNwb25zZVdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk9QRVJBVElPTl9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFU1BPTlNFX1NVRkZJWDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIFJlc3BvbnNlV3JhcHBlckF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgUmVxdWVzdFdyYXBwZXJBdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZShJVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIFJFU1BPTlNFX1NVRkZJWDsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZSh0eXBlKSArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkKLSAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDEpICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2NhbE5hbWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWUgKyBSRVNQT05TRV9TVUZGSVg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpICsgUkVTUE9OU0VfU1VGRklYIAotICAgICAgICAgICAgICAgICAgICArIEpBWFdTVXRpbHMuYWNjb3VudEZvck92ZXJsb2FkZWRNZXRob2RzKG1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9TT0FQQmluZGluZ0F0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1NPQVBCaW5kaW5nQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxMTI0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1NPQVBCaW5kaW5nQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuYW5ub3RhdGlvbnMuaW5pdGlhbGl6YXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJBTUVURVJfU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU1RZTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVVNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IGdldE1lbWJlclZhbHVlUGFpcnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBBU1QgYXN0LAotICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIFNUWUxFLCBTdHlsZS5ET0NVTUVOVCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIFVTRSwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIFBBUkFNRVRFUl9TVFlMRSwgUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7Ci0gICAgICAgIAotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFlYTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViTWV0aG9kQXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuQUNUSU9OOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk9QRVJBVElPTl9OQU1FOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBXZWJNZXRob2RBdHRyaWJ1dGVJbml0aWFsaXplciBleHRlbmRzIEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciB7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLQotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgSVR5cGUgdHlwZSA9IG1ldGhvZC5nZXRDb21waWxhdGlvblVuaXQoKS5maW5kUHJpbWFyeVR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG9wZXJhdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAgICAgT1BFUkFUSU9OX05BTUUsIGdldE9wZXJhdGlvbk5hbWVWYWx1ZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGFjdGlvblZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAKLSAgICAgICAgICAgICAgICAgICAgQUNUSU9OLCBnZXRBY3Rpb25WYWx1ZSh0eXBlLCBtZXRob2QpKTsKLQotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKGFjdGlvblZhbHVlUGFpcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWVtYmVyVmFsdWVQYWlyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgIAotICAgICAgICBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25Qcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhPUEVSQVRJT05fTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0T3BlcmF0aW9uTmFtZVZhbHVlKHR5cGUsIG1ldGhvZCksIAotICAgICAgICAgICAgICAgIAkJbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKEFDVElPTikpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0QWN0aW9uVmFsdWUodHlwZSwgbWV0aG9kKSwKLSAgICAgICAgICAgICAgICAJCW1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcGxldGlvblByb3Bvc2FsczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lVmFsdWUoSVR5cGUgdHlwZSwgSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKSArIEpBWFdTVXRpbHMuYWNjb3VudEZvck92ZXJsb2FkZWRNZXRob2RzKG1ldGhvZCk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgCUpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEFjdGlvblZhbHVlKElUeXBlIHR5cGUsIElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgcmV0dXJuICJ1cm46IiArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUuc3Vic3RyaW5nKDEpICsgSkFYV1NVdGlscy5hY2NvdW50Rm9yT3ZlcmxvYWRlZE1ldGhvZHMobWV0aG9kKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViUGFyYW1BdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJQYXJhbUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTE2YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJQYXJhbUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkFSRzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5IRUFERVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5PUEVSQVRJT05fTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QQVJUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVEFSR0VUX05BTUVTUEFDRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJQYXJhbUF0dHJpYnV0ZUluaXRpYWxpemVyIGV4dGVuZHMgQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBBU1QgYXN0LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIHBhcmFtZXRlciA9IChJTG9jYWxWYXJpYWJsZSkgamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBOQU1FLCBnZXROYW1lKHBhcmFtZXRlcikpOwotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gZ2V0Q29tcGxldGlvblByb3Bvc2Fsc0Zvck1lbWJlclZhbHVlUGFpcihJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKSB7Ci0KLSAgICAgICAgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9uUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPigpOwotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTE9DQUxfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIHBhcmFtZXRlciA9IChJTG9jYWxWYXJpYWJsZSkgamF2YUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIFN0cmluZyBtZW1iZXJWYWx1ZVBhaXJOYW1lID0gbWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhOQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXROYW1lKHBhcmFtZXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoUEFSVF9OQU1FKSkgewotICAgICAgICAgICAgICAgIGNvbXBsZXRpb25Qcm9wb3NhbHMuYWRkKGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbChnZXRQYXJ0TmFtZShwYXJhbWV0ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFRhcmdldE5hbWVzcGFjZShwYXJhbWV0ZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxzOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyKSB7Ci0gICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIHBhcmFtZXRlci5nZXRQYXJlbnQoKTsKLSAgICAgICAgaWYgKGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRXZWJNZXRob2RPcGVyYXRpb25OYW1lKG1ldGhvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBtZXRob2ROYW1lcyA9IEFycmF5cy5hc0xpc3QobWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIEFSRyArIG1ldGhvZE5hbWVzLmluZGV4T2YocGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJhbWV0ZXIuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJ0TmFtZShJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIE5BTUUpOwotICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXROYW1lKHBhcmFtZXRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKElMb2NhbFZhcmlhYmxlIHBhcmFtZXRlcikgewotICAgICAgICBpZiAoaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcocGFyYW1ldGVyKSAmJiAhaXNIZWFkZXIocGFyYW1ldGVyKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREZWZhdWx0VGFyZ2V0TmFtZXNwYWNlKHBhcmFtZXRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldE5hbWVzcGFjZShJTG9jYWxWYXJpYWJsZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgcGFyYW1ldGVyLmdldFBhcmVudCgpOwotICAgICAgICBJVHlwZSB0eXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsCi0gICAgICAgICAgICAgICAgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZXNwYWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZXNwYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBKRFRVdGlscy5nZXRUYXJnZXROYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUodHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyKSB7Ci0gICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihwYXJhbWV0ZXIsIFdlYlBhcmFtLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgQm9vbGVhbiBoZWFkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGFubm90YXRpb24sIEhFQURFUik7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyLmJvb2xlYW5WYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyKSB7Ci0gICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIHBhcmFtZXRlci5nZXRQYXJlbnQoKTsKLQotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudFdyYXBwZWQoYW5ub3RhdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiB0eXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCksCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MpOwotICAgICAgICBpZiAodHlwZUFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudFdyYXBwZWQodHlwZUFubm90YXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEb2N1bWVudEJhcmVTT0FQQmluZGluZyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGphdmFFbGVtZW50LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzKTsKLSAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIEpBWFdTVXRpbHMuaXNEb2N1bWVudEJhcmUoYW5ub3RhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gIElKYXZhRWxlbWVudC5NRVRIT0QpIHsKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgcmV0dXJuIGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFdlYk1ldGhvZE9wZXJhdGlvbk5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwKLSAgICAgICAgICAgICAgICBXZWJNZXRob2QuY2xhc3MpOwotICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgb3BlcmF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRTdHJpbmdWYWx1ZShhbm5vdGF0aW9uLCBPUEVSQVRJT05fTkFNRSk7Ci0gICAgICAgICAgICBpZiAob3BlcmF0aW9uTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9hbm5vdGF0aW9ucy9pbml0aWFsaXphdGlvbi9XZWJSZXN1bHRBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGY1OTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViUmVzdWx0QXR0cmlidXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmFubm90YXRpb25zLmluaXRpYWxpemF0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuSEVBREVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLk5BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuT1BFUkFUSU9OX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuUEFSVF9OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFU1BPTlNFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlJFVFVSTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5UQVJHRVRfTkFNRVNQQUNFOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUmVzdWx0OwotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnV0aWxzLkpEVFV0aWxzOwotCi1wdWJsaWMgY2xhc3MgV2ViUmVzdWx0QXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lbWJlclZhbHVlUGFpcj4gZ2V0TWVtYmVyVmFsdWVQYWlycyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIEFTVCBhc3QsCi0gICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZCkgamF2YUVsZW1lbnQ7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIE5BTUUsIGdldE5hbWUobWV0aG9kKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQotICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLQotICAgICAgICAgICAgU3RyaW5nIG1lbWJlclZhbHVlUGFpck5hbWUgPSBtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKTsKLQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldE5hbWUobWV0aG9kKSwgbWVtYmVyVmFsdWVQYWlyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXJOYW1lLmVxdWFscyhQQVJUX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFBhcnROYW1lKG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoVEFSR0VUX05BTUVTUEFDRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0VGFyZ2V0TmFtZXNwYWNlKG1ldGhvZCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldE5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgaWYgKGhhc0RvY3VtZW50QmFyZVNPQVBCaW5kaW5nKG1ldGhvZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRPcGVyYXRpb25OYW1lKG1ldGhvZCkgKyBSRVNQT05TRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUkVUVVJOOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJNZXRob2QuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG9wZXJhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgT1BFUkFUSU9OX05BTUUpOwotICAgICAgICAgICAgICAgIGlmIChvcGVyYXRpb25OYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtZXRob2QuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcoSUFubm90YXRhYmxlIGFubm90YXRhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oU09BUEJpbmRpbmcuY2xhc3MsIGFubm90YXRhYmxlKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50QmFyZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0YWJsZSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBhbm5vdGF0YWJsZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRCYXJlU09BUEJpbmRpbmcoKElUeXBlKSBtZXRob2QuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIAotICAgIHByaXZhdGUgU3RyaW5nIGdldFBhcnROYW1lKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oV2ViUmVzdWx0LmNsYXNzLCBtZXRob2QpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGFubm90YXRpb24sIE5BTUUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXROYW1lKG1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChoYXNEb2N1bWVudFdyYXBwZWRTT0FQQmluZGluZyhtZXRob2QpICYmICFpc0hlYWRlcihtZXRob2QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldERlZmF1bHRUYXJnZXROYW1lc3BhY2UobWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcoSUFubm90YXRhYmxlIGFubm90YXRhYmxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oU09BUEJpbmRpbmcuY2xhc3MsIGFubm90YXRhYmxlKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSkFYV1NVdGlscy5pc0RvY3VtZW50V3JhcHBlZChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhbm5vdGF0YWJsZSBpbnN0YW5jZW9mIElNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBhbm5vdGF0YWJsZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzRG9jdW1lbnRXcmFwcGVkU09BUEJpbmRpbmcoKElUeXBlKSBtZXRob2QuZ2V0UGFyZW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXIoSU1ldGhvZCBtZXRob2QpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihXZWJSZXN1bHQuY2xhc3MsIG1ldGhvZCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgQm9vbGVhbiBoZWFkZXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGFubm90YXRpb24sIEhFQURFUik7Ci0gICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuYm9vbGVhblZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0TmFtZXNwYWNlKElNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIElUeXBlIHR5cGUgPSBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKFdlYlNlcnZpY2UuY2xhc3MsIHR5cGUpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0U3RyaW5nVmFsdWUoYW5ub3RhdGlvbiwgVEFSR0VUX05BTUVTUEFDRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXROYW1lc3BhY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIEpEVFV0aWxzLmdldFRhcmdldE5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShnZXRQYWNrYWdlTmFtZSh0eXBlKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoSVR5cGUgdHlwZSkgewotICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0gICAgICAgIHJldHVybiBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2Fubm90YXRpb25zL2luaXRpYWxpemF0aW9uL1dlYlNlcnZpY2VBdHRyaWJ1dGVJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYzNTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvYW5ub3RhdGlvbnMvaW5pdGlhbGl6YXRpb24vV2ViU2VydmljZUF0dHJpYnV0ZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hbm5vdGF0aW9ucy5pbml0aWFsaXphdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLkVORFBPSU5UX0lOVEVSRkFDRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5OQU1FOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU1V0aWxzLlBPUlRfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5QT1JUX1NVRkZJWDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUudXRpbHMuSkFYV1NVdGlscy5TRVJWSUNFX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuU0VSVklDRV9TVUZGSVg7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTVXRpbHMuVEFSR0VUX05BTUVTUEFDRTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5pbml0aWFsaXphdGlvbi5Bbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlQXR0cmlidXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MpIHsKLSAgICAgICAgCi0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7Ci0gICAgCi0gICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgTkFNRSwgZ2V0TmFtZSh0eXBlKSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBQT1JUX05BTUUsIAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UG9ydE5hbWUodHlwZSkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgU0VSVklDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmljZU5hbWUodHlwZSkpOwotICAgIAotICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfTkFNRVNQQUNFLCBnZXRUYXJnZXROYW1lc3BhY2UodHlwZSkpOwotICAgIAotICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0NsYXNzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgCUpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpcnM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGdldENvbXBsZXRpb25Qcm9wb3NhbHNGb3JNZW1iZXJWYWx1ZVBhaXIoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LAotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcikgewotCi0gICAgICAgIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvblByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUpIHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotCi0gICAgICAgICAgICBTdHJpbmcgbWVtYmVyVmFsdWVQYWlyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpOwotCi0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyTmFtZS5lcXVhbHMoRU5EUE9JTlRfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gZ2V0SW50ZXJmYWNlcyh0eXBlKTsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhbkludGVyZmFjZSA6IGludGVyZmFjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGFuSW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpLCBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0lOVEVSRkFDRSksIGFuSW50ZXJmYWNlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKE5BTUUpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldE5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFBPUlRfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UG9ydE5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFNFUlZJQ0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uUHJvcG9zYWxzLmFkZChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoZ2V0U2VydmljZU5hbWUodHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpck5hbWUuZXF1YWxzKFRBUkdFVF9OQU1FU1BBQ0UpKSB7Ci0gICAgICAgICAgICAgICAgY29tcGxldGlvblByb3Bvc2Fscy5hZGQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKGdldFRhcmdldE5hbWVzcGFjZSh0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbHM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKElUeXBlIHR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyBQT1JUX1NVRkZJWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiB0eXBlLmdldEVsZW1lbnROYW1lKCkgKyBTRVJWSUNFX1NVRkZJWDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2UoSVR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZXMoSVR5cGUgdHlwZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSB0eXBlLm5ld1R5cGVIaWVyYXJjaHkodHlwZS5nZXRKYXZhUHJvamVjdCgpLCBudWxsKTsKLSAgICAgICAgICAgIElUeXBlW10gYWxsSW50ZXJmYWNlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsSW50ZXJmYWNlcygpOwotICAgICAgICAgICAgZm9yIChJVHlwZSBhSW50ZXJmYWNlIDogYWxsSW50ZXJmYWNlcykgewotICAgICAgICAgICAgICAgIGlmICghYUludGVyZmFjZS5pc0JpbmFyeSgpICYmIGFJbnRlcmZhY2UuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gYUludGVyZmFjZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUgKz0gIi4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBwYWNrYWdlTmFtZSArIGFJbnRlcmZhY2UuZ2V0UHJpbWFyeUVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VzLmFkZChxdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlczsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAJSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2RpYWxvZ3MvSGFuZGxlckNoYWluU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2RpYWxvZ3MvSGFuZGxlckNoYWluU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTIyY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9kaWFsb2dzL0hhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTSGFuZGxlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBIYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFX0VYVEVOU0lPTiA9ICJ4bWwiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIG9rX3N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBIYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotICAgICAgICBzZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX1RJVExFKTsKLSAgICAgICAgc2V0TWVzc2FnZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgc2V0QWxsb3dNdWx0aXBsZShmYWxzZSk7Ci0gICAgICAgIHNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQotICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvblswXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgSUZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIHNlbGVjdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFhNTF9GSUxFX0VYVEVOU0lPTikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTSGFuZGxlclV0aWxzLmlzSGFuZGxlckNoYWluRmlsZShmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2tfc3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGlvZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRElBTE9HX0lOVkFMSUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9kaWFsb2dzL05ld0hhbmRsZXJDaGFpbkRpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS9kaWFsb2dzL05ld0hhbmRsZXJDaGFpbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2MwNTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZGlhbG9ncy9OZXdIYW5kbGVyQ2hhaW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBOZXdIYW5kbGVyQ2hhaW5EaWFsb2cgZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgewotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIG9rX3N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgU3RyaW5nIGhhbmRsZXJDaGFpbkZpbGVOYW1lID0gImhhbmRsZXItY2hhaW4ueG1sIjsgIC8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBOZXdIYW5kbGVyQ2hhaW5EaWFsb2coU2hlbGwgcGFyZW50LCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotICAgICAgICAgICAgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLSAgICAgICAgc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX1RJVExFKTsKLSAgICAgICAgc2V0TWVzc2FnZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfREVTQ1JJUFRJT04pOwotICAgICAgICBzZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgc2V0VmFsaWRhdG9yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotICAgICAgICBDb21wb3NpdGUgZmlsZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0gICAgICAgIGZpbGVDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZmlsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgTGFiZWwgaGFuZGxlQ2hhaW5MYWJlbCA9IG5ldyBMYWJlbChmaWxlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGhhbmRsZUNoYWluTGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9OQU1FKTsKLSAgICAgICAgVGV4dCBuZXdIYW5kbGVyQ2hhaW5UZXh0ID0gbmV3IFRleHQoZmlsZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQoaGFuZGxlckNoYWluRmlsZU5hbWUpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgc3VwZXIua2V5UmVsZWFzZWQoZSk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluRmlsZU5hbWUgPSAoKFRleHQpIGUud2lkZ2V0KS5nZXRUZXh0KCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlT0tTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLSAgICAgICAgdXBkYXRlT0tTdGF0dXMoKTsKLSAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbkZpbGVOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VOVEVSX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIElTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlTmFtZShoYW5kbGVyQ2hhaW5GaWxlTmFtZSwgSVJlc291cmNlLkZJTEUpOwotICAgICAgICBpZiAoIXJlc3VsdC5pc09LKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmxlbmd0aCA9PSAwIHx8IHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19DSE9PU0VfRk9MREVSKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGFuZGxlckNoYWluRmlsZU5hbWUuZW5kc1dpdGgoIi54bWwiKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19JTlZBTElEX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGdldEZpbGVQYXRoKCkpOwotICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLSAgICAgICAgICAgIGlmIChwYXRoLmxhc3RTZWdtZW50KCkgIT0gbnVsbCAmJiBwYXRoLmxhc3RTZWdtZW50KCkuZXF1YWxzKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VNUFRZX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX0VYSVNUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5GaWxlTmFtZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG9rX3N0YXR1czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotICAgICAgICByZXR1cm4gaGFuZGxlckNoYWluRmlsZU5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLSAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBnZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgcmV0dXJuICgoSUphdmFQcm9qZWN0KSBlbGVtZW50KS5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIKLSAgICAgICAgICAgICsgaGFuZGxlckNoYWluRmlsZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuICgoSUphdmFFbGVtZW50KSBlbGVtZW50KS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3JDaGFyCi0gICAgICAgICAgICArIGhhbmRsZXJDaGFpbkZpbGVOYW1lOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChJUmVzb3VyY2UpIGVsZW1lbnQpLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgaGFuZGxlckNoYWluRmlsZU5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhhbmRsZXJDaGFpbkZpbGVOYW1lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZmlsdGVycy9OZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvZmlsdGVycy9OZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4NTVhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2ZpbHRlcnMvTmV3SGFuZGxlckNoYWluVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFX0VYVEVOU0lPTiA9ICJ4bWwiOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGZpbHRlckZpbGVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJDb21waWxhdGlvblVuaXRzOwotCi0gICAgcHVibGljIE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gZmlsdGVyRmlsZXMsIGJvb2xlYW4gZmlsdGVyQ29tcGlsYXRpb25Vbml0cykgewotICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0gICAgICAgIHRoaXMuZmlsdGVyRmlsZXMgPSBmaWx0ZXJGaWxlczsKLSAgICAgICAgdGhpcy5maWx0ZXJDb21waWxhdGlvblVuaXRzID0gZmlsdGVyQ29tcGlsYXRpb25Vbml0czsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotICAgICAgICAgICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBqYXZhUHJvamVjdC5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlsdGVyRmlsZXMgJiYgZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0gICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5pc0FjY2Vzc2libGUoKSAmJiBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoWE1MX0ZJTEVfRVhURU5TSU9OKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJDb21waWxhdGlvblVuaXRzICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0gICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQ2xhc3MoKSB8fCB0eXBlLmlzSW50ZXJmYWNlKCkgJiYgIXR5cGUuaXNBbm5vdGF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL2hhbmRsZXJzL0NvbmZpZ3VyZUhhbmRsZXJDaGFpbkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvaGFuZGxlcnMvQ29uZmlndXJlSGFuZGxlckNoYWluSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTA2OTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvaGFuZGxlcnMvQ29uZmlndXJlSGFuZGxlckNoYWluSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5oYW5kbGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLndpemFyZHMuQ29uZmlndXJlSGFuZGxlcldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUudXRpbC5Eb20yUmVzb3VyY2VNYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVIYW5kbGVyQ2hhaW5IYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7Ci0gICAgICAgIGlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotICAgICAgICAgICAgaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV2ViU2VydmljZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSVdlYlNlcnZpY2Ugd2ViU2VydmljZSA9IChJV2ViU2VydmljZSkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBEb20yUmVzb3VyY2VNYXBwZXIuSU5TVEFOQ0UuZmluZFR5cGUod2ViU2VydmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSBlbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IERvbTJSZXNvdXJjZU1hcHBlci5JTlNUQU5DRS5maW5kVHlwZShzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyZUhhbmRsZXJXaXphcmQgY29uZmlndXJlSGFuZGxlcldpemFyZCA9IG5ldyBDb25maWd1cmVIYW5kbGVyV2l6YXJkKHR5cGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGwgc2hlbGwgPSBIYW5kbGVyVXRpbC5nZXRBY3RpdmVTaGVsbChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgY29uZmlndXJlSGFuZGxlcldpemFyZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25BcnJheUNlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVlMTMzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25BcnJheUNlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGlhbG9nQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yIGV4dGVuZHMgRGlhbG9nQ2VsbEVkaXRvciB7Ci0gICAgcHJpdmF0ZSBNZXRob2QgbWV0aG9kOwotICAgIHByaXZhdGUgT2JqZWN0W10gdmFsdWVzOwotCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gb3JpZ2luYWxWYWx1ZXM7Ci0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gdXBkYXRlZFZhbHVlczsKLQotICAgIHByaXZhdGUgIEFubm90YXRpb25BcnJheURpYWxvZyBhbm5vdGF0aW9uQXJyYXlEaWFsb2c7Ci0KLSAgICBib29sZWFuIGNhbmNlbGxlZDsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXMuY2xvbmUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IG9wZW5EaWFsb2dCb3goQ29udHJvbCBjZWxsRWRpdG9yV2luZG93KSB7Ci0gICAgICAgIGFubm90YXRpb25BcnJheURpYWxvZyA9IG5ldyBBbm5vdGF0aW9uQXJyYXlEaWFsb2coY2VsbEVkaXRvcldpbmRvdy5nZXRTaGVsbCgpLCB2YWx1ZXMpOwotICAgICAgICBpbnQgcmV0dXJuVmFsdWUgPSBhbm5vdGF0aW9uQXJyYXlEaWFsb2cub3BlbigpOwotCi0gICAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgIGNhbmNlbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25BcnJheURpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgfSBpZiAocmV0dXJuVmFsdWUgPT0gV2luZG93LkNBTkNFTCkgewotICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOwotICAgICAgICBpZiAodXBkYXRlZFZhbHVlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZW50cyhPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLSAgICAgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSl2YWx1ZTsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGdldERlZmF1bHRMYWJlbCgpLnNldFRleHQoIltdey4uLn0iKTsgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ2V0RGVmYXVsdExhYmVsKCkuc2V0VGV4dCgiW117fSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGRvR2V0VmFsdWUoKSB7Ci0gICAgICAgIGlmIChjYW5jZWxsZWQgfHwgdXBkYXRlZFZhbHVlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxWYWx1ZXMgIT0gbnVsbCA/IG9yaWdpbmFsVmFsdWVzLnRvQXJyYXkoKSA6IG5ldyBPYmplY3RbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHVwZGF0ZWRWYWx1ZXMudG9BcnJheSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGRvU2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLmRvU2V0VmFsdWUodmFsdWUpOwotICAgICAgICB0aGlzLnZhbHVlcyA9IChPYmplY3RbXSl2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEFubm90YXRpb25BcnJheURpYWxvZyBleHRlbmRzIFNlbGVjdGlvblN0YXR1c0RpYWxvZyB7Ci0gICAgICAgIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uOwotICAgICAgICBwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBCdXR0b24gZG93bkJ1dHRvbjsKLSAgICAgICAgcHJpdmF0ZSBUYWJsZSBhcnJheVZhbHVlc1RhYmxlOwotICAgICAgICBwcml2YXRlIFRhYmxlVmlld2VyIGFycmF5VmFsdWVzVGFibGVWaWV3ZXI7Ci0KLSAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250cm9sPiBjb250cm9scyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29udHJvbD4oKTsKLQotICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbkFycmF5RGlhbG9nKFNoZWxsIHBhcmVudCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICAgICAgc2V0VmFsdWVzKHZhbHVlcyk7Ci0gICAgICAgICAgICBzZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9FRElUX0FSUkFZX1ZBTFVFU19USVRMRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChJQW5ub3RhdGlvbikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsT2JqZWN0Pj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVtYmVyTmFtZSA9IG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBtZW1iZXJWYWx1ZSA9IG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG12cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZUtpbmQoKSA9PSBJTWVtYmVyVmFsdWVQYWlyLktfU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdnBzLnB1dChtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlS2luZCgpID09IElNZW1iZXJWYWx1ZVBhaXIuS19DTEFTUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZwcy5wdXQobWVtYmVyTmFtZSwgbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkgKyAiLmNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTGlzdC5hZGQobXZwcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsVmFsdWVzLmFkZChhTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoYUxpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZyA9IChTdHJpbmcpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQoc3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMuYWRkKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgICAgIENvbXBvc2l0ZSBtYWluQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0gICAgICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICBncmlkRGF0YS53aWR0aEhpbnQgPSA4MDA7Ci0gICAgICAgICAgICBtYWluQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICBDb21wb3NpdGUgdHlwZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLSAgICAgICAgICAgIHR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgdHlwZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50VHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBMYWJlbCBjb21wb250VHlwZUxhYmVsID0gbmV3IExhYmVsKHR5cGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgICAgICBjb21wb250VHlwZUxhYmVsLnNldFRleHQoIkAiICsgY29tcG9uZW50VHlwZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0gICAgICAgICAgICAgICAgY29tcG9udFR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBjb21wb25lbnRUeXBlLmdldERlY2xhcmVkTWV0aG9kcygpOwotICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodHlwZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgICAgICAgICBsYWJlbC5zZXRUZXh0KG1ldGhvZC5nZXROYW1lKCkgKyAiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVudHJ5RmllbGRzKG1ldGhvZCwgdHlwZUNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0eXBlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgbGFiZWwuc2V0VGV4dChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlRW50cnlGaWVsZHMobWV0aG9kLCB0eXBlQ29tcG9zaXRlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgICAgIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0gICAgICAgICAgICBhZGRCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9BRERfTEFCRUwpOwotICAgICAgICAgICAgYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIENvbnRyb2w+PiBlbnRyeVNldCA9IGNvbnRyb2xzLmVudHJ5U2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIENvbnRyb2w+PiBpdGVyYXRvciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gYUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1hcDxTdHJpbmcsT2JqZWN0Pj4oKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgQ29udHJvbD4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0IHRleHRGaWVsZCA9IChUZXh0KSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSB0ZXh0RmllbGQuZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5wdXQobWV0aG9kLmdldE5hbWUoKSwgdGV4dEZpZWxkLmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTGlzdC5hZGQobWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZCh0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQnV0dG9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIGJ1dHRvbi5nZXREYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMucHV0KG1ldGhvZC5nZXROYW1lKCksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFMaXN0LmFkZChtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhTGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChhTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX1JFTU9WRV9MQUJFTCk7Ci0gICAgICAgICAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBhcnJheVZhbHVlc1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGFycmF5VmFsdWVzVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgdXBCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICAgICAgdXBCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9VUF9MQUJFTCk7Ci0gICAgICAgICAgICB1cEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVTZWxlY3RlZEVsZW1lbXRVcChnZXRTZWxlY3RlZEVsZW1lbnQoKSwgZ2V0VGFibGVWaWV3ZXIoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgdXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIGRvd25CdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0RPV05fTEFCRUwpOwotICAgICAgICAgICAgZG93bkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vdmVTZWxlY3RlZEVsZW1lbXREb3duKGdldFNlbGVjdGVkRWxlbWVudCgpLCBnZXRUYWJsZVZpZXdlcigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICAgICAgQ29tcG9zaXRlIHZhbHVlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUobWFpbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICAgICAgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLSAgICAgICAgICAgIHZhbHVlc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotICAgICAgICAgICAgdmFsdWVzQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgICAgICBMYWJlbCB2YWx1ZXNMYWJlbCA9IG5ldyBMYWJlbCh2YWx1ZXNDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHZhbHVlc0xhYmVsLnNldFRleHQobWV0aG9kLmdldE5hbWUoKSArICI6Iik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih2YWx1ZXNDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgICAgIHwgU1dULkhfU0NST0xMKTsKLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0PD8+KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5nZXRTaW1wbGVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSArPSAiKCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzTGlzdCA9IChMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+KWVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXA8U3RyaW5nLCBPYmplY3Q+PiB2YWx1ZXNJdGVyYXRvciA9IHZhbHVlc0xpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlc01hcCA9IHZhbHVlc0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBPYmplY3Q+PiBlbnRyeVNldCA9IHZhbHVlc01hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ZXJhdG9yID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTdHJpbmcgPSB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiAhdmFsdWUudG9TdHJpbmcoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kc1dpdGgoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbk5hbWUgKz0gZW50cnkuZ2V0S2V5KCkgKyAiPVwiIiArIHZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSArPSBlbnRyeS5nZXRLZXkoKSArICI9IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uTmFtZSArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25OYW1lICs9ICIpIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19BTk5PVEFUSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgfSBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfQ0xBU1MpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBhcnJheVZhbHVlc1RhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpdGVtQ291bnQgPSBhcnJheVZhbHVlc1RhYmxlLmdldEl0ZW1Db3VudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIGl0ZW1Db3VudCA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCAmJiBpdGVtQ291bnQgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvd25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBpdGVtQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA9PSBpdGVtQ291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZG93bkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5VmFsdWVzQ29udGVudFByb3ZpZGVyKCkpOwotCi0gICAgICAgICAgICBhcnJheVZhbHVlc1RhYmxlID0gYXJyYXlWYWx1ZXNUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgICAgIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQodmFsdWVzKTsKLQotICAgICAgICAgICAgdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBkb3duQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgICAgICAgICByZXR1cm4gbWFpbkNvbXBvc2l0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUVudHJ5RmllbGRzKE1ldGhvZCBtZXRob2QsIENvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gSGFuZGxlIEVOVU1TCi0gICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgICAgIE9iamVjdCBkZWZhdWx0VmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgLy9TdHJpbmcgb3IgU3RyaW5nW10KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpIHx8IHJldHVyblR5cGUuaXNBcnJheSgpICYmIHJldHVyblR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQodHlwZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgICAgICAgICAgdGV4dC5zZXREYXRhKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgICAgIHRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmdbXSAmJiAoKFN0cmluZ1tdKSBkZWZhdWx0VmFsdWUpLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSAoU3RyaW5nW10pIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dCh2YWx1ZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC5zZXRUZXh0KGRlZmF1bHRWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250cm9scy5wdXQobWV0aG9kLmdldE5hbWUoKSwgdGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NsYXNzIG9yIENsYXNzW10KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykgfHwgcmV0dXJuVHlwZS5pc0FycmF5KCkgJiYgcmV0dXJuVHlwZS5nZXRDb21wb25lbnRUeXBlKCkuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFRleHQgdGV4dCA9IG5ldyBUZXh0KHR5cGVDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotICAgICAgICAgICAgICAgIHRleHQuc2V0RGF0YShtZXRob2QpOwotICAgICAgICAgICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhc3NWYWx1ZSA9IChDbGFzczw/PilkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQuc2V0VGV4dChjbGFzc1ZhbHVlLmdldENhbm9uaWNhbE5hbWUoKSArICIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdXR0b24gYnJvd3NlQ2xhc3NCdXR0b24gPSBuZXcgQnV0dG9uKHR5cGVDb21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgICAgICAgICBicm93c2VDbGFzc0J1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0FSUkFZX0NFTExfRURJVE9SX0JST1dTRV9MQUJFTCk7Ci0gICAgICAgICAgICAgICAgYnJvd3NlQ2xhc3NCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gZ2V0Q2xhc3NTZWxlY3Rpb25EaWFsb2coKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTl9BUlJBWV9DRUxMX0VESVRPUl9TRUxFQ1RfQ0xBU1NfVElUTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHR5cGVzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKXR5cGVzWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0JpbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnNldFRleHQodHlwZS5nZXRDbGFzc0ZpbGUoKS5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIGNvbnRyb2xzLnB1dChtZXRob2QuZ2V0TmFtZSgpLCB0ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9Cb29sZWFuCi0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBjaGVja2JveCA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLSAgICAgICAgICAgICAgICBjaGVja2JveC5zZXREYXRhKG1ldGhvZCk7Ci0gICAgICAgICAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICAgICAgICAgIGNoZWNrYm94LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjaGVja2JveC5zZXRTZWxlY3Rpb24oKEJvb2xlYW4pZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29udHJvbHMucHV0KG1ldGhvZC5nZXROYW1lKCksIGNoZWNrYm94KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFycmF5VmFsdWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheVZhbHVlc1RhYmxlVmlld2VyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgbW92ZVNlbGVjdGVkRWxlbWVtdFVwKE9iamVjdCBzZWxlY3RlZCwgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLnJlbW92ZShzZWxlY3RlZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlZFZhbHVlcy5hZGQoc2VsZWN0aW9uSW5kZXggLSAxLCBzZWxlY3RlZCk7Ci0KLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgICAgICAgICAgICAgdGFibGVWaWV3ZXIucmV2ZWFsKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0ZWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG1vdmVTZWxlY3RlZEVsZW1lbXREb3duKE9iamVjdCBzZWxlY3RlZCwgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3Rpb25JbmRleCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgICAgIGludCBpdGVtQ291bnQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOwotICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkluZGV4IDwgaXRlbUNvdW50IC0gMSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZWRWYWx1ZXMucmVtb3ZlKHNlbGVjdGVkKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVkVmFsdWVzLmFkZChzZWxlY3Rpb25JbmRleCArIDEsIHNlbGVjdGVkKTsKLQotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICB0YWJsZVZpZXdlci5yZXZlYWwoc2VsZWN0ZWQpOwotICAgICAgICAgICAgICAgIHRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBBcnJheVZhbHVlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotICAgICAgICAgICAgcHVibGljIEFycmF5VmFsdWVzQ29udGVudFByb3ZpZGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkVmFsdWVzLnRvQXJyYXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2VsZWN0aW9uRGlhbG9nIGdldENsYXNzU2VsZWN0aW9uRGlhbG9nKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coZ2V0U2hlbGwoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiKiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRSZXN1bHQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdXBkYXRlZFZhbHVlcy50b0FycmF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzc1NzI2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklTaGFyZWRJbWFnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0NvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyIHsNCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiAoKENsYXNzPD8+KWVsZW1lbnQpLmdldE5hbWUoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIA0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsNCi0gICAgICAgICAgICByZXR1cm4gKChNZXRob2QpZWxlbWVudCkuZ2V0TmFtZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkDQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgew0KLSAgICAgICAgICAgIHJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19BTk5PVEFUSU9OKTsNCi0gICAgICAgIH0NCi0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7DQotICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoDQotICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7DQotICAgICAgICB9DQotICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFjZWE5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgewotICAgIHByaXZhdGUgVHJlZVZpZXdlciBhbm5vdGF0aW9uVHJlZVZpZXdlcjsKLSAgICBwcml2YXRlIEltYWdlIHRydWVfaW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZSBmYWxzZV9pbWFnZTsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZhbHVlc0NvbHVtbkxhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciBhbm5vdGF0aW9uVHJlZVZpZXdlcikgewotICAgICAgICB0aGlzLmFubm90YXRpb25UcmVlVmlld2VyID0gYW5ub3RhdGlvblRyZWVWaWV3ZXI7Ci0gICAgICAgIHRydWVfaW1hZ2UgPSBKQVhXU1VJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsICJpY29ucy9vYmoxNi90cnVlLmdpZiIpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIGZhbHNlX2ltYWdlID0gSkFYV1NVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCAiaWNvbnMvb2JqMTYvZmFsc2UuZ2lmIikgLy8kTk9OLU5MUy0xJAotICAgICAgICAuY3JlYXRlSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRUZXh0Rm9yTWV0aG9kKChNZXRob2QpZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZvck1ldGhvZChNZXRob2QgbWV0aG9kKSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldFRleHRGb3JNZXRob2QobWV0aG9kLCBqYXZhRWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dEZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBJSmF2YUVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotICAgICAgICBMaXN0PEFubm90YXRpb24+IGFubm90YXRpb25zID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25zKGFubm90YXRlZEVsZW1lbnQpOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcyA9IG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpOwotICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5vcm1hbEFubm90YXRpb24udmFsdWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZW1iZXJWYWx1ZVBhaXIuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dEZvck1ldGhvZChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLCBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRUZXh0Rm9yTWV0aG9kKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCksIHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldFRleHRGb3JNZXRob2QoQ2xhc3M8Pz4gcmV0dXJuVHlwZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKENsYXNzLmNsYXNzKSkgewotICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24udG9TdHJpbmcoKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSAmJiAocmV0dXJuVHlwZS5lcXVhbHMoQnl0ZS5UWVBFKQotICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkKLSAgICAgICAgICAgICAgICB8fCByZXR1cm5UeXBlLmVxdWFscyhMb25nLlRZUEUpICB8fCByZXR1cm5UeXBlLmVxdWFscyhGbG9hdC5UWVBFKQotICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKERvdWJsZS5UWVBFKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkgJiYgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEFycmF5SW5pdGlhbGl6ZXIpIHsKLSAgICAgICAgICAgIEFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJbXXsuLi59IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIltde30iOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBlbnVtVmFsdWUgPSBleHByZXNzaW9uLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gZW51bVZhbHVlLnN1YnN0cmluZyhlbnVtVmFsdWUubGFzdEluZGV4T2YoIi4iKSArIDEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yQ2xhc3MoKENsYXNzPD8+KSBlbGVtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKChNZXRob2QpIGVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAoYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotICAgICAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZUZvckNsYXNzKGFDbGFzcywgamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbnMoamF2YUVsZW1lbnQpOwotICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7Ci0gICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlX2ltYWdlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZV9pbWFnZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEltYWdlIGdldEltYWdlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKS5lcXVhbHMoQm9vbGVhbi5UWVBFKSAmJiBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0gICAgICAgICAgICBJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlRm9yTWV0aG9kKG1ldGhvZCwgamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2VGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICBpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldFNpbXBsZU5hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgfHwgYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGRlY2xhcmluZ0NsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbm9ybWFsQW5ub3RhdGlvbi52YWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhtZXRob2QuZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW5MaXRlcmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbkxpdGVyYWwpIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZV9pbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuTGl0ZXJhbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoQm9vbGVhbkxpdGVyYWwpIHNpbmdsZU1lbWJlckFubm90YXRpb24uZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZV9pbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2VfaW1hZ2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB0cnVlX2ltYWdlLmRpc3Bvc2UoKTsKLSAgICAgICAgZmFsc2VfaW1hZ2UuZGlzcG9zZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWYWx1ZXNFZGl0aW5nU3VwcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2NiNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9Bbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlNoYXJlZEFTVFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuaW5pdGlhbGl6YXRpb24uSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZhbHVlc0VkaXRpbmdTdXBwb3J0IGV4dGVuZHMgRWRpdGluZ1N1cHBvcnQgewotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldzsKLSAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotICAgIHByaXZhdGUgVGV4dENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBDaGVja2JveENlbGxFZGl0b3IgY2hlY2tib3hDZWxsRWRpdG9yOwotICAgIHByaXZhdGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLSAgICBwcml2YXRlIENsYXNzRGlhbG9nQ2VsbEVkaXRvciBjbGFzc0RpYWxvZ0NlbGxFZGl0b3I7Ci0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yIGFubm90YXRpb25BcnJheUNlbGxFZGl0b3I7Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGlvbnNWYWx1ZXNFZGl0aW5nU3VwcG9ydChBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3LCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLSAgICAgICAgc3VwZXIodHJlZVZpZXdlcik7Ci0gICAgICAgIHRoaXMudHJlZVZpZXdlciA9IHRyZWVWaWV3ZXI7Ci0gICAgICAgIHRoaXMuYW5ub3RhdGlvbnNWaWV3ID0gYW5ub3RhdGlvbnNWaWV3OwotICAgICAgICB0ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0cmVlVmlld2VyLmdldFRyZWUoKSk7Ci0gICAgICAgIGNoZWNrYm94Q2VsbEVkaXRvciA9IG5ldyBDaGVja2JveENlbGxFZGl0b3IodHJlZVZpZXdlci5nZXRUcmVlKCkpOwotICAgICAgICBjb21ib0JveENlbGxFZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBuZXcgU3RyaW5nW10ge30pOwotICAgICAgICBjbGFzc0RpYWxvZ0NlbGxFZGl0b3IgPSBuZXcgQ2xhc3NEaWFsb2dDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpKTsKLSAgICAgICAgYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvciA9IG5ldyBBbm5vdGF0aW9uQXJyYXlDZWxsRWRpdG9yKHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLCBuZXcgT2JqZWN0W10ge30pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkVkaXQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKWVsZW1lbnQ7Ci0gICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIGdldFZhbHVlKG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBjaGVja2JveENlbGxFZGl0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBlbGVtZW50OwotICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIGVudW1Db25zdGFudHMgPSByZXR1cm5UeXBlLmdldEVudW1Db25zdGFudHMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW2VudW1Db25zdGFudHMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZW51bUNvbnN0YW50c1tpXS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21ib0JveENlbGxFZGl0b3Iuc2V0SXRlbXModmFsdWVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tYm9Cb3hDZWxsRWRpdG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKEJvb2xlYW4uVFlQRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tib3hDZWxsRWRpdG9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzRGlhbG9nQ2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvci5zZXRNZXRob2QobWV0aG9kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbkFycmF5Q2VsbEVkaXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICB0ZXh0Q2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCeXRlLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUucGFyc2VCeXRlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKFNob3J0LlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0LnBhcnNlU2hvcnQoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoSW50ZWdlci5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuZXF1YWxzKExvbmcuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5wYXJzZUxvbmcoKFN0cmluZykgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQucGFyc2VGbG9hdCgoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhEb3VibGUuVFlQRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLnBhcnNlRG91YmxlKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OX0VESVRJTkdfU1VQUE9SVF9OT1RfVkFMSURfTUVTU0FHRV9QUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGV4dENlbGxFZGl0b3I7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoZWNrYm94Q2VsbEVkaXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvckNsYXNzKChDbGFzczw/PikgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvck1ldGhvZCgoTWV0aG9kKSBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8+IGFDbGFzcykgewotICAgICAgICBpZiAodHJlZVZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVGb3JDbGFzcyhhQ2xhc3MsIChJQW5ub3RhdGFibGUpIHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/PiBhQ2xhc3MsIElBbm5vdGF0YWJsZSBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICAgICAgZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uLmdldEVsZW1lbnROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KChJSmF2YUVsZW1lbnQpYW5ub3RhdGVkRWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKGFDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhhQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZ2V0VmFsdWVGb3JNZXRob2QoTWV0aG9kIG1ldGhvZCkgewotICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIElBbm5vdGF0YWJsZSkgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VmFsdWVGb3JNZXRob2QobWV0aG9kLCAoSUFubm90YXRhYmxlKSB0cmVlVmlld2VyLmdldElucHV0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBJQW5ub3RhdGFibGUgYW5ub3RhdGVkRWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gYW5ub3RhdGVkRWxlbWVudC5nZXRBbm5vdGF0aW9ucygpOwotICAgICAgICBmb3IgKElBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgewotICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIElNZW1iZXJWYWx1ZVBhaXJbXSBtZW1iZXJWYWx1ZVBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA6IG1lbWJlclZhbHVlUGFpcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW51bVZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IGVudW1WYWx1ZS5zdWJzdHJpbmcoZW51bVZhbHVlLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGVudW1Db25zdGFudHMgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEVudW1Db25zdGFudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1Db25zdGFudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1Db25zdGFudHNbaV0udG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZUtpbmQoKSA9PSBJTWVtYmVyVmFsdWVQYWlyLktfQ0xBU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYXJyYXlWYWx1ZXMgPSAoT2JqZWN0W10pbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFycmF5VmFsdWVzW2ldLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVZhbHVlc1tpXSA9IHZhbHVlICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXJWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFZhbHVlRm9yTWV0aG9kKHJldHVyblR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZUZvck1ldGhvZChDbGFzczw/PiByZXR1cm5UeXBlKSB7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MgJiYgKChDbGFzczw/PikgZWxlbWVudCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVGb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MsIChCb29sZWFuKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2QpIHsKLSAgICAgICAgICAgICAgICBzZXRWYWx1ZUZvck1ldGhvZCgoTWV0aG9kKSBlbGVtZW50LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBCb29sZWFuIGFubm90YXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIE9iamVjdCB2aWV3ZXJJbnB1dCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQotICAgICAgICBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciA9Ci0gICAgICAgICAgICBBbm5vdGF0aW9uc01hbmFnZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25Gb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MpLmdldEFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcigpOwotCi0gICAgICAgIGlmICh2aWV3ZXJJbnB1dCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotICAgICAgICAgICAgc2V0VmFsdWVGb3JDbGFzcyhhbm5vdGF0aW9uQ2xhc3MsIGFubm90YXRlLCAoSUphdmFFbGVtZW50KSB2aWV3ZXJJbnB1dCwgYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEFTVCBhc3QsIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MsCi0gICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycykgewotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9ICBudWxsOwotICAgICAgICBpbnQgbnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotICAgICAgICBpZiAobnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPT0gMCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVNYXJrZXJBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobnVtYmVyT2ZEZWNsYXJlZE1ldGhvZHMgPT0gMSkgewotICAgICAgICAgICAgRXhwcmVzc2lvbiB2YWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlycyAhPSBudWxsICYmIG1lbWJlclZhbHVlUGFpcnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gbWVtYmVyVmFsdWVQYWlycy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWVtYmVyVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIGFubm90YXRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG51bWJlck9mRGVjbGFyZWRNZXRob2RzID4gMSkgewotICAgICAgICAgICAgYW5ub3RhdGlvbiA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGb3JDbGFzcyhDbGFzczw/IGV4dGVuZHMgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbj4gYW5ub3RhdGlvbkNsYXNzLAotICAgICAgICAgICAgQm9vbGVhbiBhbm5vdGF0ZSwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBJQW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyIGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplcikKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBnZXRNZW1iZXJWYWx1ZVBhaXJzKGFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciwgamF2YUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotCi0gICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oYXN0LCBhbm5vdGF0aW9uQ2xhc3MsIG1lbWJlclZhbHVlUGFpcnMpOwotCi0gICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSgiQWRkL1JlbW92ZSBBbm5vdGF0aW9uIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgaWYgKGFubm90YXRlKSB7Ci0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9ERUNMQVJBVElPTgotICAgICAgICAgICAgICAgICAgICB8fCBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFCi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxECi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRAotICAgICAgICAgICAgICAgICAgICB8fCBqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSkgewotICAgICAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoamF2YUVsZW1lbnQsIGFubm90YXRpb25DbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0RFQ0xBUkFUSU9OCi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUKLSAgICAgICAgICAgICAgICAgICAgfHwgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQKLSAgICAgICAgICAgICAgICAgICAgfHwgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9ECi0gICAgICAgICAgICAgICAgICAgIHx8IGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgICAgIGNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgY2hhbmdlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBnZXRNZW1iZXJWYWx1ZVBhaXJzKAotICAgICAgICAgICAgSUFubm90YXRpb25BdHRyaWJ1dGVJbml0aWFsaXplciBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgQVNUIGFzdCwKLSAgICAgICAgICAgIENsYXNzPD9leHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgewotICAgICAgICBpZiAoYW5ub3RhdGlvbkF0dHJpYnV0ZUluaXRpYWxpemVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uQXR0cmlidXRlSW5pdGlhbGl6ZXIuZ2V0TWVtYmVyVmFsdWVQYWlycyhqYXZhRWxlbWVudCwgYXN0LCBhbm5vdGF0aW9uQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBzZXRWYWx1ZUZvck1ldGhvZChNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCgoQm9vbGVhbikgZ2V0VmFsdWUobWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkpKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgT2JqZWN0IHZpZXdlcklucHV0ID0gdHJlZVZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICAgICAgaWYgKHZpZXdlcklucHV0IGluc3RhbmNlb2YgSUFubm90YXRhYmxlKSB7Ci0gICAgICAgICAgICAgICAgc2V0VmFsdWVGb3JNZXRob2QobWV0aG9kLCB2YWx1ZSwgKElKYXZhRWxlbWVudCkgdmlld2VySW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlRm9yTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCB2YWx1ZSwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgc291cmNlID0gQW5ub3RhdGlvblV0aWxzLmdldENvbXBpbGF0aW9uVW5pdEZyb21KYXZhRWxlbWVudChqYXZhRWxlbWVudCk7Ci0gICAgICAgIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBTaGFyZWRBU1RQcm92aWRlci5nZXRBU1Qoc291cmNlLCBTaGFyZWRBU1RQcm92aWRlci5XQUlUX1lFUywgbnVsbCk7Ci0gICAgICAgIEFTVCBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0KLSAgICAgICAgVGV4dEZpbGVDaGFuZ2UgY2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQvVXBkYXRlIEFubm90YXRpb24gVmFsdWUiLCAoSUZpbGUpIHNvdXJjZS5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLSAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0KLSAgICAgICAgTGlzdDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCk7Ci0gICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotICAgICAgICAgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFubm90YXRpb25OYW1lID0gbm9ybWFsQW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSB8fCBhbm5vdGF0aW9uTmFtZS5lcXVhbHMoZGVjbGFyaW5nQ2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBub3JtYWxBbm5vdGF0aW9uLnZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc01lbWJlclZhbHVlUGFpciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgOiBtZW1iZXJWYWx1ZVBhaXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNUTm9kZSBtZW1iZXJWYWx1ZSA9IGdldE1lbWJlclZhbHVlUGFpclZhbHVlKGFzdCwgbWV0aG9kLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVVwZGF0ZU1lbWJlclZhbHVlUGFpclRleHRFZGl0KG1lbWJlclZhbHVlUGFpciwgbWVtYmVyVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWVtYmVyVmFsdWVQYWlyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaGFzTWVtYmVyVmFsdWVQYWlyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gZ2V0TWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyVmFsdWVQYWlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkTWVtYmVyVmFsdWVQYWlyVGV4dEVkaXQobm9ybWFsQW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb247Ci0gICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MgPSBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRTaW1wbGVOYW1lKCkpIHx8IGFubm90YXRpb25OYW1lLmVxdWFscyhkZWNsYXJpbmdDbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSBnZXRNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlclZhbHVlUGFpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRleHRFZGl0KHNpbmdsZU1lbWJlckFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBjaGFuZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgQVNUTm9kZSBnZXRNZW1iZXJWYWx1ZVBhaXJWYWx1ZShBU1QgYXN0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTGl0ZXJhbChhc3QsICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpCi0gICAgICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoTG9uZy5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICBpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKS5nZXRDb21wb25lbnRUeXBlKCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoYXN0LCBtZXRob2QsIChPYmplY3RbXSkgdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKGFzdCwgKE9iamVjdFtdKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQ2xhc3MuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVR5cGVMaXRlcmFsKGFzdCwgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0VudW0oKSkgewotICAgICAgICAgICAgaW50IHNlbGVjdGVkID0gKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZCAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bUxpdGVyYWwoYXN0LCBtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldEVudW1Db25zdGFudHMoKVtzZWxlY3RlZF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVtYmVyVmFsdWVQYWlyIGdldE1lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBNZXRob2QgbWV0aG9kLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksIChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5lcXVhbHMoQm9vbGVhbi5UWVBFKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgKEJvb2xlYW4pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc1ByaW1pdGl2ZSgpCi0gICAgICAgICAgICAgICAgJiYgKHJldHVyblR5cGUuZXF1YWxzKEJ5dGUuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoU2hvcnQuVFlQRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJldHVyblR5cGUuZXF1YWxzKEludGVnZXIuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoTG9uZy5UWVBFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRmxvYXQuVFlQRSkgfHwgcmV0dXJuVHlwZS5lcXVhbHMoRG91YmxlLlRZUEUpKSkgewotICAgICAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0dXJuVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKS5pc0Fubm90YXRpb24oKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVBcnJheU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZCwgKE9iamVjdFtdKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZXRob2QuZ2V0TmFtZSgpLCAoT2JqZWN0W10pIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZU1lbWJlclZhbHVlUGFpcihhc3QsIG1ldGhvZC5nZXROYW1lKCksIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJldHVyblR5cGUuaXNFbnVtKCkpIHsKLSAgICAgICAgICAgIGludCBzZWxlY3RlZCA9ICgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCBtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW51bUNvbnN0YW50cygpW3NlbGVjdGVkXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgSVVuZG9NYW5hZ2VyIG1hbmFnZXIgPSBSZWZhY3RvcmluZ0NvcmUuZ2V0VW5kb01hbmFnZXIoKTsKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzZnVsID0gZmFsc2U7Ci0gICAgICAgIENoYW5nZSB1bmRvQ2hhbmdlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBSZWZhY3RvcmluZ1N0YXR1cyB2YWxpZCA9IGNoYW5nZS5pc1ZhbGlkKG1vbml0b3IpOwotICAgICAgICAgICAgaWYgKHZhbGlkLmlzT0soKSkgewotICAgICAgICAgICAgICAgIG1hbmFnZXIuYWJvdXRUb1BlcmZvcm1DaGFuZ2UoY2hhbmdlKTsKLSAgICAgICAgICAgICAgICB1bmRvQ2hhbmdlID0gY2hhbmdlLnBlcmZvcm0obW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIG1hbmFnZXIuY2hhbmdlUGVyZm9ybWVkKGNoYW5nZSwgc3VjY2Vzc2Z1bCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVuZG9DaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdW5kb0NoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0gICAgICAgICAgICBtYW5hZ2VyLmFkZFVuZG8odW5kb0NoYW5nZS5nZXROYW1lKCksIHVuZG9DaGFuZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGFubm90YXRpb25zVmlldy5yZWZyZXNoTGFiZWxzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZW1iZXJWYWx1ZVBhaXIgY3JlYXRlQXJyYXlNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gdmFsdWVzKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWV0aG9kLmdldE5hbWUoKSwgY3JlYXRlQXJyYXlWYWx1ZUxpdGVyYWwoYXN0LAotICAgICAgICAgICAgICAgIG1ldGhvZCwgdmFsdWVzKSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBBcnJheUluaXRpYWxpemVyIGNyZWF0ZUFycmF5VmFsdWVMaXRlcmFsKEFTVCBhc3QsIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHZhbHVlcykgewotICAgICAgICBBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOwotICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24+KSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICAgICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgICAgICAgICBMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHZhbHVlc0xpc3QgPSAoTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwPFN0cmluZywgT2JqZWN0Pj4gdmFsdWVzSXRlcmF0b3IgPSB2YWx1ZXNMaXN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGFubm90YXRpb25NYXAgPSB2YWx1ZXNJdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIFNldDxFbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U2V0ID0gYW5ub3RhdGlvbk1hcC5lbnRyeVNldCgpOwotICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+PiBpdGVyYXRvciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxqYXZhLmxhbmcuU3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lbWJlck5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGFubm90YXRpb25NZXRob2QgPSBhbm5vdGF0aW9uQ2xhc3MuZ2V0TWV0aG9kKG1lbWJlck5hbWUsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25NZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbWVtYmVyVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiByZXR1cm5UeXBlID0gYW5ub3RhdGlvbk1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgbWVtYmVyTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWUudG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChBbm5vdGF0aW9uc0NvcmUuY3JlYXRlQm9vbGVhbk1lbWJlclZhbHVlUGFpcihhc3QsIG1lbWJlck5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCb29sZWFuKSBtZW1iZXJWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmVxdWFscyhDbGFzcy5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBtZW1iZXJWYWx1ZS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlVHlwZUxpdGVyYWwoYXN0LCBjbGFzc05hbWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChnZXROdW1iZXJNZW1iZXJWYWx1ZVBhaXIoYXN0LCBtZW1iZXJOYW1lLCBtZW1iZXJWYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0NvcmVQbHVnaW4ubG9nKHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNDb3JlUGx1Z2luLmxvZyhuc21lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCkuYWRkKEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgYW5ub3RhdGlvbkNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NDEzOGFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS52aWV3czsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5hY3Rpb25zLkFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2lkZ2V0cy5DbGFzc3BhdGhDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU51bGxTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1ZpZXcgZXh0ZW5kcyBWaWV3UGFydCBpbXBsZW1lbnRzIElOdWxsU2VsZWN0aW9uTGlzdGVuZXIsIElQYXJ0TGlzdGVuZXIyIHsKLSAgICBwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotICAgIHByaXZhdGUgVHJlZSBhbm5vdGF0aW9uVHJlZTsKLQotICAgIHByaXZhdGUgQ29tcG9zaXRlIG5vdEF2YWlhYmxlQ29tcG9zaXRlOwotICAgIHByaXZhdGUgQ2xhc3NwYXRoQ29tcG9zaXRlIHNldHVwQ2xhc3NwYXRoQ29tcG9zaXRlOwotCi0gICAgcHJpdmF0ZSBUcmVlVmlld2VyIGFubm90YXRpb25UcmVlVmlld2VyOwotCi0gICAgcHJpdmF0ZSBJTWVtZW50byBtZW1lbnRvOwotCi0gICAgcHJpdmF0ZSBBbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24gYW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uOwotCi0gICAgcHVibGljIEFubm90YXRpb25zVmlldygpIHsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCi0gICAgICAgIGFubm90YXRpb25UcmVlID0gbmV3IFRyZWUocGFnZUJvb2ssIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMCi0gICAgICAgICAgICAgICAgfCBTV1QuSF9TQ1JPTEwpOwotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGFubm90YXRpb25UcmVlKTsKLQotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLmdldFRyZWUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBhbm5vdGF0aW9uc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKGFubm90YXRpb25UcmVlVmlld2VyLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFubm90YXRpb25zVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25zQ29sdW1uTGFiZWxQcm92aWRlcigpKTsKLSAgICAgICAgVHJlZUNvbHVtbiBhbm5vdGF0aW9uc0NvbHVtbiA9IGFubm90YXRpb25zVmlld2VyQ29sdW1uLmdldENvbHVtbigpOwotICAgICAgICBhbm5vdGF0aW9uc0NvbHVtbi5zZXRXaWR0aCg0MDApOwotICAgICAgICBhbm5vdGF0aW9uc0NvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0gICAgICAgIGFubm90YXRpb25zQ29sdW1uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfQ09MVU1OX05BTUUpOwotCi0gICAgICAgIFRyZWVWaWV3ZXJDb2x1bW4gdmFsdWVzVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4oYW5ub3RhdGlvblRyZWVWaWV3ZXIsIFNXVC5OT05FKTsKLSAgICAgICAgdmFsdWVzVmlld2VyQ29sdW1uLnNldExhYmVsUHJvdmlkZXIobmV3IEFubm90YXRpb25zVmFsdWVzQ29sdW1uTGFiZWxQcm92aWRlcihhbm5vdGF0aW9uVHJlZVZpZXdlcikpOwotICAgICAgICB2YWx1ZXNWaWV3ZXJDb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEFubm90YXRpb25zVmFsdWVzRWRpdGluZ1N1cHBvcnQodGhpcywgYW5ub3RhdGlvblRyZWVWaWV3ZXIpKTsKLSAgICAgICAgVHJlZUNvbHVtbiB2YWx1ZXNDb2x1bW4gPSB2YWx1ZXNWaWV3ZXJDb2x1bW4uZ2V0Q29sdW1uKCk7Ci0gICAgICAgIHZhbHVlc0NvbHVtbi5zZXRXaWR0aCg0MDApOwotICAgICAgICB2YWx1ZXNDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotICAgICAgICB2YWx1ZXNDb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgICAgdmFsdWVzQ29sdW1uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfVkFMVUVTX0NPTFVNTl9OQU1FKTsKLQotICAgICAgICAvL1NlbGVjdGlvbiBTZXJ2aWNlCi0gICAgICAgIHN0YXJ0TGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpOwotICAgICAgICAvL1BhcnQgU2VydmljZQotICAgICAgICBnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotCi0gICAgICAgIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKTsKLQotICAgICAgICBub3RBdmFpYWJsZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OT05FKTsKLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbm90QXZhaWFibGVDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICBub3RBdmFpYWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgbm90QXZhaWFibGVDb21wb3NpdGUuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChub3RBdmFpYWJsZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBsYWJlbC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgICAgIGxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfQU5OT1RBVElPTlNfTk9UX0FWQUlMQUJMRV9PTl9TRUxFQ1RJT04pOwotCi0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG9iajEgaW5zdGFuY2VvZiBDbGFzczw/PiAmJiAoKENsYXNzPD8+KSBvYmoxKS5pc0Fubm90YXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChvYmoyIGluc3RhbmNlb2YgQ2xhc3M8Pz4gJiYgKChDbGFzczw/Pikgb2JqMikuaXNBbm5vdGF0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikgb2JqMSkuZ2V0Q2Fub25pY2FsTmFtZSgpLmNvbXBhcmVUbygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENsYXNzPD8gZXh0ZW5kcyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uPikgb2JqMikuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG9iajEgaW5zdGFuY2VvZiBNZXRob2QgJiYgb2JqMiBpbnN0YW5jZW9mIE1ldGhvZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChNZXRob2Qpb2JqMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygoKE1ldGhvZClvYmoyKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iajEsIG9iajIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICAvL1RPRE8gQWRkIGEgRmFjZXRlZCBQcm9qZWN0IGNvbXBvc2l0ZQotICAgICAgICBzZXR1cENsYXNzcGF0aENvbXBvc2l0ZSA9IG5ldyBDbGFzc3BhdGhDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OT05FKTsKLQotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShub3RBdmFpYWJsZUNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpIHsKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzdG9wTGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpIHsKLSAgICAgICAgZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkucmVtb3ZlUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCi0gICAgICAgIGlmICh3b3JrYmVuY2hQYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgPSB3b3JrYmVuY2hQYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotICAgICAgICBpZiAod29ya2JlbmNoUGFydFJlZmVyZW5jZSA9PSBudWxsIHx8IHdvcmtiZW5jaFBhcnRSZWZlcmVuY2UuZ2V0SWQoKS5lcXVhbHMoZ2V0Vmlld1NpdGUoKS5nZXRJZCgpKQotICAgICAgICAgICAgICAgIHx8ICF3b3JrYmVuY2hQYXJ0UmVmZXJlbmNlLmdldElkKCkuZXF1YWxzKEphdmFVSS5JRF9DVV9FRElUT1IpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotICAgICAgICBJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCA9IChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0KLSAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRleHRTZWxlY3Rpb24pIHsKLSAgICAgICAgICAgIElUZXh0U2VsZWN0aW9uIHR4dFNlbGVjdGlvbiA9IChUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0gICAgICAgICAgICBpZiAoY29tcGlsYXRpb25Vbml0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KGNvbXBpbGF0aW9uVW5pdCwgdHh0U2VsZWN0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0gICAgICAgIFRyZWVQYXRoW10gZXhwYW5kZWRUcmVlUGF0aHMgPSBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRFeHBhbmRlZFRyZWVQYXRocygpOwotCi0gICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0KLSAgICAgICAgaWYgKCFjaGVja0NsYXNzcGF0aChqYXZhUHJvamVjdCkpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2Uoc2V0dXBDbGFzc3BhdGhDb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFnZUJvb2suc2hvd1BhZ2UoYW5ub3RhdGlvblRyZWUpOwotCi0gICAgICAgIGludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAgICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KWphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGphdmFFbGVtZW50ID0gY29tcGlsYXRpb25Vbml0LmdldEVsZW1lbnRBdChvZmZzZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfREVDTEFSQVRJT04pIHsKLSAgICAgICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkuZXF1YWxzKCJwYWNrYWdlLWluZm8uamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXQoamF2YUVsZW1lbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LklNUE9SVF9ERUNMQVJBVElPTikgewotICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuVFlQRSkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKCF0eXBlLmlzTWVtYmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXQodHlwZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIuc2V0SW5wdXQobnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuRklFTEQpIHsKLSAgICAgICAgICAgICAgICBJRmllbGQgZmllbGQgPSAoSUZpZWxkKWphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICghZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpLmlzTWVtYmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXQoZmllbGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotICAgICAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gKElNZXRob2QpIGphdmFFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmICghbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5pc01lbWJlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TG9jYWxWYXJpYWJsZShtZXRob2QsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFZhcmlhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldElucHV0KGxvY2FsVmFyaWFibGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5wdXQobWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KG51bGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldEV4cGFuZGVkVHJlZVBhdGhzKGV4cGFuZGVkVHJlZVBhdGhzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0SW5wdXQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0gICAgICAgIGlmIChhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRJbnB1dCgpID09IG51bGwpIHsKLSAgICAgICAgICAgIGFubm90YXRpb25UcmVlVmlld2VyLnNldElucHV0KGphdmFFbGVtZW50KTsKLSAgICAgICAgfSBlbHNlIGlmICghYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0SW5wdXQoKS5lcXVhbHMoamF2YUVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChqYXZhRWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tDbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIGNhdGVnb3JpZXMuYWRkQWxsKEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9uQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgVmlld2VyRmlsdGVyW10gdmlld2VyRmlsdGVycyA9IGFubm90YXRpb25UcmVlVmlld2VyLmdldEZpbHRlcnMoKTsKLSAgICAgICAgZm9yIChWaWV3ZXJGaWx0ZXIgdmlld2VyRmlsdGVyIDogdmlld2VyRmlsdGVycykgewotICAgICAgICAgICAgaWYgKHZpZXdlckZpbHRlciBpbnN0YW5jZW9mIEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyKSB7Ci0gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5yZW1vdmVBbGwoKChBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcil2aWV3ZXJGaWx0ZXIpLmdldENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGp3c1JlYWR5ID0gdHJ1ZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgIExpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucyA9IEFubm90YXRpb25zTWFuYWdlcgotICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uc0J5Q2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMuZ2V0KDApLmdldEFubm90YXRpb25DbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGp3c1JlYWR5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHNldHVwQ2xhc3NwYXRoQ29tcG9zaXRlLnVwZGF0ZUxpYnJhcnlMYWJlbChjYXRlZ29yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gandzUmVhZHk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgICAgIElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotICAgICAgICBpZiAocGFydFJlZi5nZXRJZCgpLmVxdWFscyhKYXZhVUkuSURfQ1VfRURJVE9SKSkgewotICAgICAgICAgICAgamF2YUVkaXRvckFjdGl2YXRlZCgoSUVkaXRvclBhcnQpIHdvcmtiZW5jaFBhcnQpOwotICAgICAgICB9IGVsc2UgaWYgKHBhcnRSZWYuZ2V0SWQoKS5lcXVhbHMoZ2V0Vmlld1NpdGUoKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNWaWV3QWN0aXZhdGVkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbGVhckFubm90YXRpb25zVmlldygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgICAgIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHN0YXJ0TGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgICAgIGlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKGdldFZpZXdTaXRlKCkuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIHN0b3BMaXN0ZW5pbmdGb3JTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLSAgICAgICAgaWYgKHBhcnRSZWYuZ2V0SWQoKS5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgIGlmIChnZXRWaWV3U2l0ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IGdldFZpZXdTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdvcmtiZW5jaFdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAod29ya2JlbmNoUGFnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvclBhcnQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIShlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIUlERS5nZXRFZGl0b3JEZXNjcmlwdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RmlsZSgpKS5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJBbm5vdGF0aW9uc1ZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhwaWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFydElucHV0Q2hhbmdlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyQW5ub3RhdGlvbnNWaWV3KCkgewotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5zZXRJbnB1dChudWxsKTsKLSAgICAgICAgYW5ub3RhdGlvblRyZWVWaWV3ZXIucmVmcmVzaCgpOwotICAgICAgICBwYWdlQm9vay5zaG93UGFnZShub3RBdmFpYWJsZUNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGphdmFFZGl0b3JBY3RpdmF0ZWQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotICAgICAgICBJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0OwotICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLSAgICAgICAgaWYgKGphdmFFbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBhZ2VCb29rLnNob3dQYWdlKGFubm90YXRpb25UcmVlKTsKLSAgICAgICAgICAgIHVwZGF0ZVZpZXcoamF2YUVsZW1lbnQsIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLSAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQoZWRpdG9yUGFydCwgc2VsZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbm5vdGF0aW9uc1ZpZXdBY3RpdmF0ZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvciA9IElERS5nZXRFZGl0b3JEZXNjcmlwdG9yKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yRGVzY3JpcHRvci5nZXRJZCgpLmVxdWFscyhKYXZhVUkuSURfQ1VfRURJVE9SKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamF2YUVkaXRvckFjdGl2YXRlZChlZGl0b3JQYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhwaWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICBzdG9wTGlzdGVuaW5nRm9yU2VsZWN0aW9uQ2hhbmdlcygpOwotICAgICAgICBnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgbWVtZW50byk7Ci0gICAgICAgIHRoaXMubWVtZW50byA9IG1lbWVudG87Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgc3VwZXIuc2F2ZVN0YXRlKG1lbWVudG8pOwotICAgICAgICBhbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24uc2F2ZVN0YXRlKG1lbWVudG8pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb250cmlidXRlVG9BY3Rpb25CYXJzKCkgewotICAgICAgICBJQWN0aW9uQmFycyBiYXJzID0gZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0gICAgICAgIGZpbGxMb2NhbFB1bGxEb3duKGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIGFubm90YXRpb25zVmlld0ZpbHRlckFjdGlvbiA9IG5ldyBBbm5vdGF0aW9uc1ZpZXdGaWx0ZXJBY3Rpb24odGhpcywgYW5ub3RhdGlvblRyZWVWaWV3ZXIsCi0gICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkFOTk9UQVRJT05TX1ZJRVdfRklMVEVSX0FDVElPTl9OQU1FKTsKLSAgICAgICAgaWYgKG1lbWVudG8gIT0gbnVsbCkgewotICAgICAgICAgICAgYW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uLmluaXQobWVtZW50byk7Ci0gICAgICAgIH0KLSAgICAgICAgbWFuYWdlci5hZGQoYW5ub3RhdGlvbnNWaWV3RmlsdGVyQWN0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoTGFiZWxzKCkgewotICAgICAgICBhbm5vdGF0aW9uVHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLSAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gYW5ub3RhdGlvblRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKTsKLSAgICAgICAgaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVkaXRvclBhcnQuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgSURFLmdldEVkaXRvckRlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKSkuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoSmF2YVVJLklEX0NVX0VESVRPUikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGV4dEVkaXRvciB0eHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIHdvcmtiZW5jaFBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgdHh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21waWxhdGlvblVuaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBpbGF0aW9uVW5pdC5pc0NvbnNpc3RlbnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsYXRpb25Vbml0Lm1ha2VDb25zaXN0ZW50KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXcoY29tcGlsYXRpb25Vbml0LCAoSVRleHRTZWxlY3Rpb24pIHR4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIHBpZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2cocGllLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2YWYxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVmlld0NhdGVnb3J5RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NBVEVHT1JZID0gIkFubm90YXRpb25DYXRlZ29yeUZpbHRlckluZm8iOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRFR09SWV9OQU1FID0gImNhdGVnb3J5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgQW5ub3RhdGlvbnNWaWV3IGFubm90YXRpb25zVmlldzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCi0gICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gY2F0ZWdvcmllczsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uc1ZpZXdDYXRlZ29yeUZpbHRlcihBbm5vdGF0aW9uc1ZpZXcgYW5ub3RhdGlvbnNWaWV3LCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotICAgICAgICB0aGlzLmFubm90YXRpb25zVmlldyA9IGFubm90YXRpb25zVmlldzsKLSAgICAgICAgdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0gICAgICAgIGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0gICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MgJiYgKChDbGFzczw/PikgZWxlbWVudCkuaXNBbm5vdGF0aW9uKCkpIHsKLSAgICAgICAgICAgIEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gQW5ub3RhdGlvbnNNYW5hZ2VyLgotICAgICAgICAgICAgICAgIGdldEFubm90YXRpb25EZWZpbml0aW9uRm9yQ2xhc3MoKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPillbGVtZW50KTsKLSAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFjYXRlZ29yaWVzLmNvbnRhaW5zKGFubm90YXRpb25EZWZpbml0aW9uLmdldENhdGVnb3J5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbHRlckFubm90YXRpb25zKExpc3Q8T2JqZWN0PiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgIHRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7Ci0gICAgICAgIGlmIChjYXRlZ29yaWVzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHZpZXdlci5hZGRGaWx0ZXIodGhpcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2aWV3ZXIucmVtb3ZlRmlsdGVyKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGFubm90YXRpb25zVmlldy5yZWZyZXNoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRDYXRlZ29yaWVzKCkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElNZW1lbnRvIG1lbWVudG8pIHsKLSAgICAgICAgSU1lbWVudG8gY2F0TWVtZW50byA9IG1lbWVudG8uZ2V0Q2hpbGQoVEFHX0NBVEVHT1JZKTsKLSAgICAgICAgaWYgKGNhdE1lbWVudG8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25DYXRlZ29yaWVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdE1lbWVudG8uZ2V0U3RyaW5nKFRBR19DQVRFR09SWV9OQU1FICsgaSk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaWx0ZXJBbm5vdGF0aW9ucyhjYXRlZ29yaWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotICAgICAgICBpZiAoY2F0ZWdvcmllcyA9PSBudWxsIHx8IGNhdGVnb3JpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBJTWVtZW50byBjYXRNZW1lbnRvID0gbWVtZW50by5jcmVhdGVDaGlsZChUQUdfQ0FURUdPUlkpOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoT2JqZWN0IGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgY2F0TWVtZW50by5wdXRTdHJpbmcoVEFHX0NBVEVHT1JZX05BTUUgKyBpLCBjYXRlZ29yeS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3ZpZXdzL0Fubm90YXRpb25zVmlld0NvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YTIyYmVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbnNWaWV3Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCXJldHVybiAoKENsYXNzPD8+KXBhcmVudEVsZW1lbnQpLmdldERlY2xhcmVkTWV0aG9kcygpOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzcykgewotCQkJcmV0dXJuICgoQ2xhc3M8Pz4pZWxlbWVudCkuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoID4gMDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCAhPSBudWxsICYmIGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCAmJiAoKElKYXZhRWxlbWVudCkgaW5wdXRFbGVtZW50KS5leGlzdHMoKSkgewotCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgaW5wdXRFbGVtZW50OwotCQkJcmV0dXJuIEFubm90YXRpb25zTWFuYWdlci5nZXRBbm5vdGF0aW9ucyhqYXZhRWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9DbGFzc0RpYWxvZ0NlbGxFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvdmlld3MvQ2xhc3NEaWFsb2dDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTc4NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS92aWV3cy9DbGFzc0RpYWxvZ0NlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGlhbG9nQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc0RpYWxvZ0NlbGxFZGl0b3IgZXh0ZW5kcyBEaWFsb2dDZWxsRWRpdG9yIHsKLQotICAgIHB1YmxpYyBDbGFzc0RpYWxvZ0NlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBvcGVuRGlhbG9nQm94KENvbnRyb2wgY2VsbEVkaXRvcldpbmRvdykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKGNlbGxFZGl0b3JXaW5kb3cuZ2V0U2hlbGwoKSwgCi0gICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksIAotICAgICAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsIAotICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIiogIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotICAgICAgICAgICAgICAgIE9iamVjdFtdIHR5cGVzID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0eXBlcyAhPSBudWxsICYmIHR5cGVzLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IChJVHlwZSl0eXBlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNCaW5hcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnRzKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0RGVmYXVsdExhYmVsKCkuc2V0VGV4dCh2YWx1ZS50b1N0cmluZygpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXREZWZhdWx0TGFiZWwoKS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aWRnZXRzL0NsYXNzcGF0aENvbXBvc2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aWRnZXRzL0NsYXNzcGF0aENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWRlYmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2lkZ2V0cy9DbGFzc3BhdGhDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotcHVibGljIGNsYXNzIENsYXNzcGF0aENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgSlJFX1BSRUZfUEFHRV9JRCA9ICJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkucHJlZmVyZW5jZXMuVk1QcmVmZXJlbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIFN0cmluZyBQUk9QX0lEID0gIm9yZy5lY2xpcHNlLmpkdC51aS5wcm9wZXJ0eVBhZ2VzLkJ1aWxkUGF0aHNQcm9wZXJ0eVBhZ2UiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBPYmplY3QgREFUQV9SRVZFQUxfRU5UUlkgPSAic2VsZWN0X2NsYXNzcGF0aF9lbnRyeSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHByaXZhdGUgTGFiZWwgaW5mb3JtYXRpb25MYWJlbDsKLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NwYXRoQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkQ29udHJvbHMoKSB7Ci0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIHRoaXMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICB0aGlzLnNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICBpbmZvcm1hdGlvbkxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLSAgICAgICAgaW5mb3JtYXRpb25MYWJlbC5zZXRCYWNrZ3JvdW5kKGdldFBhcmVudCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLSAgICAgICAgaW5mb3JtYXRpb25MYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX05PX1NVSVRBQkxFX0xJQlJBUllfRk9VTkQsICJKQVgtV1MiKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgTGluayBsaW5rID0gbmV3IExpbmsodGhpcywgU1dULk5PTkUpOwotICAgICAgICBsaW5rLnNldEJhY2tncm91bmQoZ2V0UGFyZW50KCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOwotICAgICAgICBsaW5rLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkNPTkZJR1VSRV9KQVZBXzFfNl9MSUJSQVJZKTsKLSAgICAgICAgbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkV2ZW50LnRleHQuZXF1YWxzKCIxIikpIHsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIEpSRV9QUkVGX1BBR0VfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgSlJFX1BSRUZfUEFHRV9JRCB9LCBudWxsKS5vcGVuKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPE9iamVjdCwgSUNsYXNzcGF0aEVudHJ5PiBkYXRhID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJQ2xhc3NwYXRoRW50cnk+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEucHV0KERBVEFfUkVWRUFMX0VOVFJZLCBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcm9wZXJ0eURpYWxvZ09uKGdldFNoZWxsKCksIGdldFByb2plY3QoKSwgUFJPUF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBQUk9QX0lEIH0sIGRhdGEpLm9wZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAvL1RPRE8gdXBkYXRlIHRoZSBsYWJlbHMgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3Igc3VwcG9ydGVkIGFubm90YXRpb24gbGlicmFyaWVzIHRoYXQgYXJlIG1pc3NpbmcKLSAgICAgICAgLy9vbiB0aGUgc2VsZWN0ZWQgcHJvamVjdHMgY2xhc3NwYXRoLgotICAgICAgICAvL0xhYmVsIG90aGVyTGlicmFyaWVzTGFiZWwgID0gbmV3IExhYmVsKHRoaXMsIFNXVC5TSEFET1dfSU4pOwotICAgICAgICAvL290aGVyTGlicmFyaWVzTGFiZWwuc2V0QmFja2dyb3VuZChnZXRQYXJlbnQoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dISVRFKSk7Ci0gICAgICAgIC8vb3RoZXJMaWJyYXJpZXNMYWJlbC5zZXRUZXh0KCJBbm5vdGF0aW9uIExpYnJhcmllcyBjdXJyZW50bHkgc3VwcG9ydGVkOiAiICsgQW5ub3RhdGlvbnNNYW5hZ2VyLmdldEFubm90YXRpb25DYXRlZ29yaWVzKCkpOwotICAgICAgICAvL290aGVyTGlicmFyaWVzTGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuQU5OT1RBVElPTlNfVklFV19PVEhFUl9BTk5PVEFUSU9OX0xJQlJBUklFU19VU0UpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKChGaWxlRWRpdG9ySW5wdXQpIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0gICAgICAgICAgICAgICAgLmdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvcklucHV0KCkpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUxpYnJhcnlMYWJlbChTdHJpbmcgbGlicmFyeU5hbWUpIHsKLSAgICAgICAgaW5mb3JtYXRpb25MYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5iaW5kKAotICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5BTk5PVEFUSU9OU19WSUVXX05PX1NVSVRBQkxFX0xJQlJBUllfRk9VTkQsIGxpYnJhcnlOYW1lKSk7Ci0gICAgfQotICAgIAotIH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9BZGRIYW5kbGVyQ2hhaW5QYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvQWRkSGFuZGxlckNoYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRhMDZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9BZGRIYW5kbGVyQ2hhaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZGlhbG9ncy5IYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmRpYWxvZ3MuTmV3SGFuZGxlckNoYWluRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5maWx0ZXJzLk5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIEFkZEhhbmRsZXJDaGFpblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotICAgIHByaXZhdGUgSVN0YXR1cyBva19zdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCAiIik7ICAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBJVHlwZSB0eXBlOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uOwotICAgIHByaXZhdGUgVGV4dCBuZXdIYW5kbGVyQ2hhaW5UZXh0OwotICAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0IGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b247Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZmlsZUNyZWF0ZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgQWRkSGFuZGxlckNoYWluUGFnZShJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHN1cGVyKCJhZGQuaGFuZGxlcmNoYWluLndpemFyZC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgc2V0VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0FERF9IQU5ETEVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLSAgICAgICAgc2V0RGVzY3JpcHRpb24oSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0FERF9IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLSAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0gICAgICAgIGludCBuQ29sdW1ucyA9IDQ7Ci0KLSAgICAgICAgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zPSBuQ29sdW1uczsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEUpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBlbmFibGVOZXdIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyhidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIGVuYWJsZUVkaXRIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyghYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIGNyZWF0ZU5ld0hhbmRsZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgY3JlYXRlTmV3SGFuZGxlckxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEgpOwotCi0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBOZXdIYW5kbGVyQ2hhaW5EaWFsb2cgZGlhbG9nID0gbmV3IE5ld0hhbmRsZXJDaGFpbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyKG5ldyBOZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIodHlwZS5nZXRKYXZhUHJvamVjdCgpLCB0cnVlLCB0cnVlKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChkaWFsb2cuZ2V0RmlsZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLSAgICAgICAgZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ0hPT1NFKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYWRkVG9IYW5kbGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgIGFkZFRvSGFuZGxlckxhYmVsLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9GSUxFX1BBVEgpOwotCi0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLQotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXIobmV3IE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcih0eXBlLmdldEphdmFQcm9qZWN0KCksIGZhbHNlLCB0cnVlKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmVzdWx0ID0gZGlhbG9nLmdldFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSByZXN1bHRbMF07Ci0gICAgICAgICAgICAgICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0VGV4dChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0KLSAgICAgICAgc2V0SW5pdGlhbFNlbGVjdGlvbigpOwotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oKSB7Ci0gICAgICAgIElQYXRoIGhhbmRsZXJDaGFpblBhdGggPSBuZXcgUGF0aCh0eXBlLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpCi0gICAgICAgICAgICAgICAgKyAiaGFuZGxlci1jaGFpbi54bWwiKTsKLSAgICAgICAgSVJlc291cmNlIGhhbmRsZXJDaGFpbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShoYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpbi5leGlzdHMoKSkgewotICAgICAgICAgICAgZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQoaGFuZGxlckNoYWluUGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgICAgIGVuYWJsZUVkaXRIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyh0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQoaGFuZGxlckNoYWluUGF0aC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKHRydWUpOwotICAgICAgICAgICAgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZUNyZWF0ZWQoYm9vbGVhbiBmaWxlQ3JlYXRlZCkgewotICAgICAgICB0aGlzLmZpbGVDcmVhdGVkID0gZmlsZUNyZWF0ZWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLSAgICAgICAgaWYgKHZpc2libGUgJiYgZmlsZUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICgoQ29uZmlndXJlSGFuZGxlcldpemFyZCkgZ2V0V2l6YXJkKCkpLmRlbGV0ZUZpbGUobmV3IFBhdGgoZ2V0TmV3SGFuZGxlckNoYWluUGF0aCgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQ3JlYXRlSGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLmdldFNlbGVjdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRWRpdEhhbmRsZXJDaGFpbigpIHsKLSAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkgewotICAgICAgICByZXR1cm4gbmV3SGFuZGxlckNoYWluVGV4dC5nZXRUZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHZhbGlkYXRlTmV3SGFuZGxlckNoYWluRmllbGQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlRXhpc3RpbmdIYW5kbGVyQ2hhaW5GaWVsZCgpOwotICAgICAgICAgICAgaWYgKGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0sgfHwgZWRpdEhhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spIHsKLSAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoZmluZE1vc3RTZXZlcmUoKS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGptZS5nZXRTdGF0dXMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgZmluZE1vc3RTZXZlcmUoKSB7Ci0gICAgICAgIGlmIChhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWRpdEhhbmRsZXJDaGFpblN0YXR1cy5nZXRTZXZlcml0eSgpID4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBlZGl0SGFuZGxlckNoYWluU3RhdHVzLmdldFNldmVyaXR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZU5ld0hhbmRsZXJDaGFpbkZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0NyZWF0ZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICAgICAgU3RyaW5nIG5ld0hhbmRsZXJDaGFpblBhdGggPSBnZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKG5ld0hhbmRsZXJDaGFpblBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9ORVdfSEFORExFUl9QQVRIX0VNVFBZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFuZXdIYW5kbGVyQ2hhaW5QYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19JTlZBTElEX05BTUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3SGFuZGxlckNoYWluUGF0aCk7Ci0gICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2VnbWVuZXRzID0gcGF0aC5zZWdtZW50cygpOwotICAgICAgICAgICAgICAgIGlmICghc2VnbWVuZXRzWzBdLmVxdWFscyh0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5Tb3VyY2VGb2xkZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gdHlwZS5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290IDogcGFja2FnZUZyYWdtZW50Um9vdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbmV0c1sxXS5lcXVhbHMocGFja2FnZUZyYWdtZW50Um9vdC5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5Tb3VyY2VGb2xkZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFpblNvdXJjZUZvbGRlcikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGgubGFzdFNlZ21lbnQoKSAhPSBudWxsICYmIHBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMoIi54bWwiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19FTVBUWV9GSUxFX05BTUUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmIHJlcy5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfRVhJU1RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlRXhpc3RpbmdIYW5kbGVyQ2hhaW5GaWVsZCgpIHsKLSAgICAgICAgaWYgKGlzRWRpdEhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICBTdHJpbmcgZXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoID0gZ2V0RXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKCkudHJpbSgpOwotICAgICAgICAgICAgaWYgKGV4aXN0aW5nSGFuZGxlckNoYWluUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FWElTVElOR19IQU5ETEVSX1BBVEhfRU1UUFkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWV4aXN0aW5nSGFuZGxlckNoYWluUGF0aC5lbmRzV2l0aCgiLnhtbCIpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0lOVkFMSURfTkFNRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKGV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCk7Ci0KLSAgICAgICAgICAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5sYXN0U2VnbWVudCgpICE9IG51bGwgJiYgcGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscygiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VNUFRZX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+PSAyICYmIHBhdGguc2VnbWVudCgwKS5lcXVhbHModHlwZS5nZXRKYXZhUHJvamVjdCgpLmdldEVsZW1lbnROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0VESVRfRklMRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9Db25maWd1cmVIYW5kbGVyV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvQ29uZmlndXJlSGFuZGxlcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Y3ZTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9Db25maWd1cmVIYW5kbGVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTSGFuZGxlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyZUhhbmRsZXJXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotICAgIHByaXZhdGUgQWRkSGFuZGxlckNoYWluUGFnZSBhZGRIYW5kbGVyQ2hhaW5QYWdlOwotICAgIHByaXZhdGUgT3JkZXJIYW5kbGVyQ2hhaW5QYWdlIG9yZGVySGFuZGxlckNoYWluUGFnZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmaWxlQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkQW5ub3RhdGlvbjsKLQotICAgIHByaXZhdGUgSVBhdGggaGFuZGxlckNoYWluUGF0aDsKLSAgICBwcml2YXRlIElUeXBlIHR5cGU7Ci0KLSAgICBwdWJsaWMgQ29uZmlndXJlSGFuZGxlcldpemFyZChJVHlwZSB0eXBlKSB7Ci0gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgIHNldFdpbmRvd1RpdGxlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19DT05GSUdVUkVfSEFORExFUl9XSVpBUkRfVElUTEUpOwotICAgICAgICAvL1RPRE8gcmVwbGFjZSB3aXRoIGRlZGljYXRlZCBoYW5kbGVyIHdpemJhbgotICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKQVhXU1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiJG5sJC9pY29ucy93aXpiYW4vbmV3X3dpei5wbmciKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgIGhhbmRsZXJDaGFpblBhdGggPSBnZXRIYW5kbGVyQ2hhaW5QYXRoKHR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBpZiAoYWRkSGFuZGxlckNoYWluUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhZGRIYW5kbGVyQ2hhaW5QYWdlID0gbmV3IEFkZEhhbmRsZXJDaGFpblBhZ2UodHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9yZGVySGFuZGxlckNoYWluUGFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBvcmRlckhhbmRsZXJDaGFpblBhZ2UgPSBuZXcgT3JkZXJIYW5kbGVyQ2hhaW5QYWdlKGhhbmRsZXJDaGFpblBhdGgsIHR5cGUuZ2V0SmF2YVByb2plY3QoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpblBhdGggIT0gbnVsbCAmJiBoYW5kbGVyQ2hhaW5QYXRoLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgYWRkUGFnZShhZGRIYW5kbGVyQ2hhaW5QYWdlKTsKLSAgICAgICAgfQotICAgICAgICBhZGRQYWdlKG9yZGVySGFuZGxlckNoYWluUGFnZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLSAgICAgICAgaWYgKHBhZ2UgPT0gYWRkSGFuZGxlckNoYWluUGFnZSAmJiBhZGRIYW5kbGVyQ2hhaW5QYWdlLmlzUGFnZUNvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgIGlmIChhZGRIYW5kbGVyQ2hhaW5QYWdlLmlzQ3JlYXRlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW5QYXRoID0gbmV3IFBhdGgoYWRkSGFuZGxlckNoYWluUGFnZS5nZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkpOwotICAgICAgICAgICAgICAgIG9yZGVySGFuZGxlckNoYWluUGFnZS5zZXRIYW5kbGVyQ2hhaW5QYXRoKGhhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGZpbGVDcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhZGRIYW5kbGVyQ2hhaW5QYWdlLnNldEZpbGVDcmVhdGVkKGZpbGVDcmVhdGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRIYW5kbGVyQ2hhaW5QYWdlLmlzRWRpdEhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluUGF0aCA9IG5ldyBQYXRoKGFkZEhhbmRsZXJDaGFpblBhZ2UuZ2V0RXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKCkpOwotICAgICAgICAgICAgICAgIG9yZGVySGFuZGxlckNoYWluUGFnZS5zZXRIYW5kbGVyQ2hhaW5QYXRoKGhhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIGZpbGVDcmVhdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYWRkSGFuZGxlckNoYWluUGFnZS5zZXRGaWxlQ3JlYXRlZChmaWxlQ3JlYXRlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVBhdGggZ2V0SGFuZGxlckNoYWluUGF0aChJVHlwZSB0eXBlKSB7Ci0gICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEFubm90YXRpb24gaGFuZGxlckNoYWluID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgSGFuZGxlckNoYWluLmNsYXNzKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlID0gQW5ub3RhdGlvblV0aWxzLmdldFN0cmluZ1ZhbHVlKGhhbmRsZXJDaGFpbiwgImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLnN0YXJ0c1dpdGgoIi4uLyIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldFBhdGgoKS5hcHBlbmQobmV3IFBhdGgoZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmRIYW5kbGVyQ2hhaW5QYXRoKGZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYXRoLkVNUFRZOwotICAgIH0KLQotICAgIHByaXZhdGUgSVBhdGggZmluZEhhbmRsZXJDaGFpblBhdGgoU3RyaW5nIGZpbGUpIHsKLSAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSB0eXBlLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCk7Ci0gICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUoZmlsZS5zdGFydHNXaXRoKCIuLi8iKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKDMpOwotICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSVJlc291cmNlIGhhbmRsZXJDaGFpbkZpbGUgPSBjb250YWluZXIuZmluZE1lbWJlcihmaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNoYWluRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyQ2hhaW5GaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYXRoLkVNUFRZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0gICAgICAgIHRyeSB7Ci0KLSAgICAgICAgICAgIElTY2hlZHVsaW5nUnVsZSBydWxlID0gbnVsbDsKLSAgICAgICAgICAgIEpvYiBqb2IgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLmN1cnJlbnRKb2IoKTsKLSAgICAgICAgICAgIGlmIChqb2IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bGUgPSBqb2IuZ2V0UnVsZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBydWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB3b3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKHJ1bGUpIHsKLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICBpZiAoYWRkQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShoYW5kbGVyQ2hhaW5QYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgVVJJIHJlbGF0aXZlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoaGFuZGxlckNoYWluRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpLmRlcmVzb2x2ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh0eXBlLmdldFJlc291cmNlKCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0U291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgY3UgPSAoQ29tcGlsYXRpb25Vbml0KXBhcnNlci5jcmVhdGVBU1QobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGZpbGVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihjdS5nZXRBU1QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUiLCByZWxhdGl2ZVVSSS50b0ZpbGVTdHJpbmcoKSk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChmaWxlUGFpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihjdS5nZXRBU1QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlckNoYWluLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkQW5ub3RhdGlvbih0eXBlLCBoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRJbXBvcnQodHlwZSwgSGFuZGxlckNoYWluLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSkFYV1NIYW5kbGVyVXRpbHMud3JpdGVEb2N1bWVudFRvRmlsZShoYW5kbGVyQ2hhaW5QYXRoLCBvcmRlckhhbmRsZXJDaGFpblBhZ2UuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShnZXRDb250YWluZXIoKSwgd29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uLCBydWxlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGl0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gY2F0Y2ggIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coaWUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUZpbGUoSVBhdGggZmlsZVBhdGgpIHsKLSAgICAgICAgSUZpbGUgaGFuZGxlckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotICAgICAgICBpZiAoaGFuZGxlckZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlckZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGNlLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotICAgICAgICBpZiAoZmlsZUNyZWF0ZWQpIHsKLSAgICAgICAgICAgIElQYXRoIGZpbGVQYXRoID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRQYXRoKCkuYXBwZW5kKG5ldyBQYXRoKCJoYW5kbGVyLWNoYWluLnhtbCIpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgZGVsZXRlRmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnBlcmZvcm1DYW5jZWwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9OZXdKQVhXU0hhbmRsZXJXaXphcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9OZXdKQVhXU0hhbmRsZXJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1OTIxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvTmV3SkFYV1NIYW5kbGVyV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLkhhbmRsZXJDaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLnV0aWxzLkpBWFdTSGFuZGxlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5KQVhXU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3cmVzb3VyY2UuQmFzaWNOZXdSZXNvdXJjZVdpemFyZDsKLQotcHVibGljIGNsYXNzIE5ld0pBWFdTSGFuZGxlcldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotICAgIHByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0gICAgcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLSAgICBwcml2YXRlIE5ld0pBWFdTSGFuZGxlcldpemFyZFBhZ2UgaGFuZGxlcldpemFyZFBhZ2U7Ci0gICAgcHJpdmF0ZSBPcmRlckhhbmRsZXJDaGFpblBhZ2UgaGFuZGxlck9yZGVyUGFnZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotICAgICAgICBpZiAoaGFuZGxlcldpemFyZFBhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlcldpemFyZFBhZ2U9IG5ldyBOZXdKQVhXU0hhbmRsZXJXaXphcmRQYWdlKCk7Ci0gICAgICAgICAgICBoYW5kbGVyV2l6YXJkUGFnZS5pbml0KGdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYW5kbGVyT3JkZXJQYWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIGhhbmRsZXJPcmRlclBhZ2UgPSBuZXcgT3JkZXJIYW5kbGVyQ2hhaW5QYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUGFnZShoYW5kbGVyV2l6YXJkUGFnZSk7Ci0gICAgICAgIGFkZFBhZ2UoaGFuZGxlck9yZGVyUGFnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE5ld0pBWFdTSGFuZGxlcldpemFyZCgpIHsKLSAgICAgICAgc2V0V2luZG93VGl0bGUoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfV0laQVJEX1RJVExFKTsKLSAgICAgICAgLy9UT0RPIHJlcGxhY2Ugd2l0aCBkZWRpY2F0ZWQgaGFuZGxlciB3aXpiYW4KLSAgICAgICAgc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSkFYV1NVSVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoIiRubCQvaWNvbnMvd2l6YmFuL25ld193aXoucG5nIikpOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0gICAgICAgIGlmIChwYWdlID09IGhhbmRsZXJXaXphcmRQYWdlICYmIGhhbmRsZXJXaXphcmRQYWdlLmlzQ29uZmlndXJlSGFuZGxlckNoYWluKCkgJiYgaGFuZGxlcldpemFyZFBhZ2UuaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZXJPcmRlclBhZ2Uuc2V0SmF2YVByb2plY3QoaGFuZGxlcldpemFyZFBhZ2UuZ2V0SmF2YVByb2plY3QoKSk7Ci0gICAgICAgICAgICBJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoID0gbmV3IFBhdGgoaGFuZGxlcldpemFyZFBhZ2UuZ2V0RXhpc3RpbmdIYW5kbGVyQ2hhaW5QYXRoKCkpOwotICAgICAgICAgICAgaGFuZGxlck9yZGVyUGFnZS5zZXRJbnB1dChoYW5kbGVyQ2hhaW5QYXRoKTsKLSAgICAgICAgICAgIGhhbmRsZXJPcmRlclBhZ2UuYWRkSGFuZGxlcihoYW5kbGVyV2l6YXJkUGFnZS5nZXRUeXBlTmFtZSgpLCBoYW5kbGVyV2l6YXJkUGFnZS5nZXRQYWNrYWdlVGV4dCgpLCBoYW5kbGVyV2l6YXJkUGFnZS5nZXRTZWxlY3RlZEhhbmRsZXJUeXBlKCkpOwotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJPcmRlclBhZ2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLSAgICAgICAgdHJ5IHsKLQotICAgICAgICAgICAgSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBudWxsOwotICAgICAgICAgICAgSm9iIGpvYiA9IEpvYi5nZXRKb2JNYW5hZ2VyKCkuY3VycmVudEpvYigpOwotICAgICAgICAgICAgaWYgKGpvYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVsZSA9IGpvYi5nZXRSdWxlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJ1bGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24ocnVsZSkgewotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlcldpemFyZFBhZ2UuY3JlYXRlVHlwZShtb25pdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgSVR5cGUgdHlwZSA9IGhhbmRsZXJXaXphcmRQYWdlLmdldENyZWF0ZWRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyV2l6YXJkUGFnZS5pc0NvbmZpZ3VyZUhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcldpemFyZFBhZ2UuaXNDcmVhdGVIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIGhhbmRsZXJDaGFpblBhdGggPSBuZXcgUGF0aChoYW5kbGVyV2l6YXJkUGFnZS5nZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTSGFuZGxlclV0aWxzLmNyZWF0ZUhhbmRsZXJDaGFpbkZpbGUoaGFuZGxlckNoYWluUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NIYW5kbGVyVXRpbHMuYWRkSGFuZGxlclRvSGFuZGxlckNoYWluKGhhbmRsZXJDaGFpblBhdGgsIHR5cGUuZ2V0RWxlbWVudE5hbWUoKSwgdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJXaXphcmRQYWdlLmlzRWRpdEhhbmRsZXJDaGFpbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggaGFuZGxlckNoYWluUGF0aCA9IG5ldyBQYXRoKGhhbmRsZXJXaXphcmRQYWdlLmdldEV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU0hhbmRsZXJVdGlscy53cml0ZURvY3VtZW50VG9GaWxlKGhhbmRsZXJDaGFpblBhdGgsIGhhbmRsZXJPcmRlclBhZ2UuZ2V0RG9jdW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcldpemFyZFBhZ2UuaXNBc3NvY2lhdGVIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBoYW5kbGVyV2l6YXJkUGFnZS5nZXRTZWxlY3RlZFdlYlNlcnZpY2VQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGUgd2ViU2VydmljZVR5cGUgPSBoYW5kbGVyV2l6YXJkUGFnZS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggaGFuZGxlckNoYWluUGF0aCA9IG5ldyBQYXRoKGhhbmRsZXJXaXphcmRQYWdlLmdldEhhbmRsZXJDaGFpblBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZpbGUgaGFuZGxlckNoYWluRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShoYW5kbGVyQ2hhaW5QYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSSSByZWxhdGl2ZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkuZGVyZXNvbHZlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh3ZWJTZXJ2aWNlVHlwZS5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IHdlYlNlcnZpY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc2V0U291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsYXRpb25Vbml0IGN1ID0gKENvbXBpbGF0aW9uVW5pdClwYXJzZXIuY3JlYXRlQVNUKG51bGwpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24od2ViU2VydmljZVR5cGUsIEhhbmRsZXJDaGFpbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGZpbGVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcihoYW5kbGVyQ2hhaW5Bbm5vdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZVBhaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBmaWxlID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoY3UuZ2V0QVNUKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlVVJJLnRvRmlsZVN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIoZmlsZVBhaXIsIGZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGZpbGVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihjdS5nZXRBU1QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSIsIHJlbGF0aXZlVVJJLnRvRmlsZVN0cmluZygpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZmlsZVBhaXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGhhbmRsZXJDaGFpbkFubm90YXRpb24gPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihjdS5nZXRBU1QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW4uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmFkZEFubm90YXRpb24od2ViU2VydmljZVR5cGUsIGhhbmRsZXJDaGFpbkFubm90YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkSW1wb3J0KHdlYlNlcnZpY2VUeXBlLCBIYW5kbGVyQ2hhaW4uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoZ2V0Q29udGFpbmVyKCksIHdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiwgcnVsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhpdGUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoICAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGllKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIElSZXNvdXJjZSByZXNvdXJjZT0gaGFuZGxlcldpemFyZFBhZ2UuZ2V0TW9kaWZpZWRSZXNvdXJjZSgpOwotICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgQmFzaWNOZXdSZXNvdXJjZVdpemFyZC5zZWxlY3RBbmRSZXZlYWwocmVzb3VyY2UsIHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0gICAgICAgICAgICBvcGVuUmVzb3VyY2UoKElGaWxlKSByZXNvdXJjZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIG9wZW5SZXNvdXJjZShmaW5hbCBJRmlsZSByZXNvdXJjZSkgewotICAgICAgICBmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLSAgICAgICAgaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgRGlzcGxheSBkaXNwbGF5PSBnZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLSAgICAgICAgICAgIGlmIChkaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgcmVzb3VyY2UsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvTmV3SkFYV1NIYW5kbGVyV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9qYXh3cy91aS93aXphcmRzL05ld0pBWFdTSGFuZGxlcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlNzcxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvTmV3SkFYV1NIYW5kbGVyV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1R5cGVXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuSkFYV1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkuZGlhbG9ncy5IYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLmRpYWxvZ3MuTmV3SGFuZGxlckNoYWluRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5maWx0ZXJzLk5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIE5ld0pBWFdTSGFuZGxlcldpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbG9naWNhbEhhbmRsZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gc29hcEhhbmRsZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgb2tfc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHN1cGVyQ2xhc3NJbXBsZW1lbnRzU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICBwcml2YXRlIElTdGF0dXMgZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgcHJpdmF0ZSBJU3RhdHVzIGFzc29jaWF0ZVdlYlNlcnZpY2VTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0gICAgcHJpdmF0ZSBDb21ibyBoYW5kbGVyVHlwZUNvbWJvOwotICAgIHByaXZhdGUgQnV0dG9uIGNvbmZpZ3VyZUhhbmRsZXJDaGFpbkJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0IG5ld0hhbmRsZXJDaGFpblRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBCdXR0b24gZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dDsKLSAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VFeGlzdGluZ0hhbmRsZXJDaGFpbkJ1dHRvbjsKLQotICAgIHByaXZhdGUgQnV0dG9uIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbjsKLSAgICBwcml2YXRlIFRleHQgd2ViU2VydmljZVRleHQ7Ci0gICAgcHJpdmF0ZSBCdXR0b24gYnJvd3NlV2ViU2VydmljZUJ1dHRvbjsKLQotICAgIHB1YmxpYyBOZXdKQVhXU0hhbmRsZXJXaXphcmRQYWdlKCkgewotICAgICAgICBzdXBlcih0cnVlLCAiY3JlYXRlLm5ldy5oYW5kbGVyLmNoYWluLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRSk7Ci0gICAgICAgIHNldERlc2NyaXB0aW9uKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OKTsKLSAgICAgICAgbG9naWNhbEhhbmRsZXJMaXN0LmFkZCgiamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXI8amF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbE1lc3NhZ2VDb250ZXh0PiIpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBzb2FwSGFuZGxlckxpc3QuYWRkKCJqYXZheC54bWwud3MuaGFuZGxlci5zb2FwLlNPQVBIYW5kbGVyPGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUE1lc3NhZ2VDb250ZXh0PiIpOyAgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IGdldEluaXRpYWxKYXZhRWxlbWVudChzZWxlY3Rpb24pOwotICAgICAgICBpbml0Q29udGFpbmVyUGFnZShqYXZhRWxlbWVudCk7Ci0gICAgICAgIGluaXRUeXBlUGFnZShqYXZhRWxlbWVudCk7Ci0gICAgICAgIGRvU3RhdHVzVXBkYXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotICAgICAgICBpbnQgbkNvbHVtbnMgPSA0OwotCi0gICAgICAgIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucz0gbkNvbHVtbnM7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgY3JlYXRlQ29udGFpbmVyQ29udHJvbHMoY29tcG9zaXRlLCBuQ29sdW1ucyk7Ci0gICAgICAgIGNyZWF0ZVBhY2thZ2VDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQotICAgICAgICBjcmVhdGVTZXBhcmF0b3IoY29tcG9zaXRlLCBuQ29sdW1ucyk7Ci0KLSAgICAgICAgY3JlYXRlVHlwZU5hbWVDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLSAgICAgICAgY3JlYXRlTW9kaWZpZXJDb250cm9scyhjb21wb3NpdGUsIG5Db2x1bW5zKTsKLQotICAgICAgICBjcmVhdGVTdXBlckNsYXNzQ29udHJvbHMoY29tcG9zaXRlLCBuQ29sdW1ucyk7Ci0KLSAgICAgICAgTGFiZWwgaGFuZGxlclR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgaGFuZGxlclR5cGVMYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX1RZUEUpOwotCi0gICAgICAgIGhhbmRsZXJUeXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0KLSAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgaGFuZGxlclR5cGVDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgaGFuZGxlclR5cGVDb21iby5hZGQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0xPR0lDQUxfSEFORExFUik7Ci0gICAgICAgIGhhbmRsZXJUeXBlQ29tYm8uYWRkKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19TT0FQX0hBTkRMRVIpOwotICAgICAgICBoYW5kbGVyVHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZXRTdXBlckludGVyZmFjZXMobG9naWNhbEhhbmRsZXJMaXN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBzZXRTdXBlckludGVyZmFjZXMoc29hcEhhbmRsZXJMaXN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIEdyb3VwIGNvbmZpZ3VyYXRpb25Hcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfTk9ORSk7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Hcm91cC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT04pOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gMTsKLSAgICAgICAgY29uZmlndXJhdGlvbkdyb3VwLnNldExheW91dChncmlkTGF5b3V0KTsKLQotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGNvbmZpZ3VyYXRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjb25maWd1cmVIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ3VyYXRpb25Hcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgY29uZmlndXJlSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BREQpOwotICAgICAgICBjb25maWd1cmVIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVOZXdIYW5kbGVyQ2hhaW5GaWxlV2lkZ2V0cyhjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZVdlYlNlcnZpY2VXaWRnZXRzKGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZU5ld0hhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlRWRpdEhhbmRsZXJDaGFpbkZpbGVXaWRnZXRzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5hYmxlV2ViU2VydmljZVdpZGdldHMoZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLSAgICAgICAgY29uZmlndXJlSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIEdyb3VwIGlubmVyR3JvdXAgPSBuZXcgR3JvdXAoY29uZmlndXJhdGlvbkdyb3VwLCBTV1QuU0hBRE9XX05PTkUpOwotICAgICAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLSAgICAgICAgaW5uZXJHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIGdyaWREYXRhLmhvcml6b250YWxTcGFuID0gNDsKLSAgICAgICAgaW5uZXJHcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGlubmVyR3JvdXAsIFNXVC5SQURJTyk7Ci0gICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGNyZWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgY3JlYXRlSGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbikgZS53aWRnZXQ7Ci0gICAgICAgICAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLSAgICAgICAgICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoIWJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0pOwotCi0gICAgICAgIExhYmVsIGNyZWF0ZU5ld0hhbmRsZXJMYWJlbCA9IG5ldyBMYWJlbChpbm5lckdyb3VwLCBTV1QuTk9ORSk7Ci0gICAgICAgIGNyZWF0ZU5ld0hhbmRsZXJMYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIKTsKLQotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0ID0gbmV3IFRleHQoaW5uZXJHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldEZvbnQoaW5uZXJHcm91cC5nZXRGb250KCkpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIG5ld0hhbmRsZXJDaGFpblRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VOZXdIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGlubmVyR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9CUk9XU0UpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYnJvd3NlTmV3SGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBOZXdIYW5kbGVyQ2hhaW5EaWFsb2cgZGlhbG9nID0gbmV3IE5ld0hhbmRsZXJDaGFpbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyKG5ldyBOZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIoZ2V0SmF2YVByb2plY3QoKSwgdHJ1ZSwgdHJ1ZSkpOwotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBuZXdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQoZGlhbG9nLmdldEZpbGVQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lckdyb3VwLCBTV1QuUkFESU8pOwotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgTGFiZWwgYWRkVG9IYW5kbGVyTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJHcm91cCwgU1dULk5PTkUpOwotICAgICAgICBhZGRUb0hhbmRsZXJMYWJlbC5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRklMRV9QQVRIKTsKLQotICAgICAgICBlZGl0SGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dCA9IG5ldyBUZXh0KGlubmVyR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotICAgICAgICBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b24gPSBuZXcgQnV0dG9uKGlubmVyR3JvdXAsIFNXVC5QVVNIKTsKLSAgICAgICAgYnJvd3NlRXhpc3RpbmdIYW5kbGVyQ2hhaW5CdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBIYW5kbGVyQ2hhaW5TZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEhhbmRsZXJDaGFpblNlbGVjdGlvbkRpYWxvZyhnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsKLQotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRJbnB1dChKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSkpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXIobmV3IE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcihnZXRKYXZhUHJvamVjdCgpLCBmYWxzZSwgdHJ1ZSkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcmVzdWx0WzBdOwotICAgICAgICAgICAgICAgICAgICBleGlzaXRpbmdIYW5kbGVyQ2hhaW5UZXh0LnNldFRleHQocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb25maWd1cmVIYW5kbGVyU3RhdHVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjcmVhdGVTZXBhcmF0b3IoaW5uZXJHcm91cCwgbkNvbHVtbnMpOwotCi0gICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbiA9IG5ldyBCdXR0b24oaW5uZXJHcm91cCwgU1dULkNIRUNLKTsKLSAgICAgICAgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0gICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgYXNzb2NpYXRlSGFuZGxlckNoYWluQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9BU1NPQ0lBVEUpOwotICAgICAgICBhc3NvY2lhdGVIYW5kbGVyQ2hhaW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLSAgICAgICAgICAgICAgICBlbmFibGVXZWJTZXJ2aWNlV2lkZ2V0cyhidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBMYWJlbCB3ZWJTZXJ2aWNlTGFiZWwgPSBuZXcgTGFiZWwoaW5uZXJHcm91cCwgU1dULk5PTkUpOwotICAgICAgICB3ZWJTZXJ2aWNlTGFiZWwuc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dFQl9TRVJWSUNFKTsKLQotICAgICAgICB3ZWJTZXJ2aWNlVGV4dCA9IG5ldyBUZXh0KGlubmVyR3JvdXAsICBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotICAgICAgICB3ZWJTZXJ2aWNlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLSAgICAgICAgd2ViU2VydmljZVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgICAgICBicm93c2VXZWJTZXJ2aWNlQnV0dG9uID0gbmV3IEJ1dHRvbihpbm5lckdyb3VwLCBTV1QuUFVTSCk7Ci0gICAgICAgIGJyb3dzZVdlYlNlcnZpY2VCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0JST1dTRSk7Ci0gICAgICAgIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGJyb3dzZVdlYlNlcnZpY2VCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLSAgICAgICAgYnJvd3NlV2ViU2VydmljZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nKGdldFNoZWxsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKCksIG5ldyBTdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX1dTX0RJQUxPR19USVRMRSk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfREVTQ1JJUFRJT04pOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRBbGxvd011bHRpcGxlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0SW5wdXQoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQotICAgICAgICAgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXIobmV3IE5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcihnZXRKYXZhUHJvamVjdCgpLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRWYWxpZGF0b3IobmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvblswXSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQgPSAoSUNvbXBpbGF0aW9uVW5pdCkgc2VsZWN0aW9uWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oY29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBva19zdGF0dXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9XU19ESUFMT0dfSU5WQUxJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICAgICAgICAgICAgICB3ZWJTZXJ2aWNlVGV4dC5zZXRUZXh0KHNlbGVjdGVkQ29tcGlsYXRpb25Vbml0LmZpbmRQcmltYXJ5VHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29uZmlndXJlSGFuZGxlclN0YXR1cygpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICBjb21wb3NpdGUucGFjaygpOwotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0gICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGVkaXRIYW5kbGVyQ2hhaW5CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGFzc29jaWF0ZUhhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoZmFsc2UpOwotICAgICAgICBlbmFibGVXZWJTZXJ2aWNlV2lkZ2V0cyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBjb25maWd1cmVIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDcmVhdGVIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFZGl0SGFuZGxlckNoYWluKCkgewotICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkSGFuZGxlclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBoYW5kbGVyVHlwZUNvbWJvLmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5ld0hhbmRsZXJDaGFpblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBuZXdIYW5kbGVyQ2hhaW5UZXh0LmdldFRleHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIGV4aXNpdGluZ0hhbmRsZXJDaGFpblRleHQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlckNoYWluUGF0aCgpIHsKLSAgICAgICAgaWYgKGlzQ3JlYXRlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXROZXdIYW5kbGVyQ2hhaW5QYXRoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNFZGl0SGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRFeGlzdGluZ0hhbmRsZXJDaGFpblBhdGgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBc3NvY2lhdGVIYW5kbGVyQ2hhaW4oKSB7Ci0gICAgICAgIHJldHVybiBhc3NvY2lhdGVIYW5kbGVyQ2hhaW5CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFdlYlNlcnZpY2VQYXRoKCkgewotICAgICAgICByZXR1cm4gd2ViU2VydmljZVRleHQuZ2V0VGV4dCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmFibGVFZGl0SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgZXhpc2l0aW5nSGFuZGxlckNoYWluVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZUV4aXN0aW5nSGFuZGxlckNoYWluQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlTmV3SGFuZGxlckNoYWluRmlsZVdpZGdldHMoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgbmV3SGFuZGxlckNoYWluVGV4dC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgICAgIGJyb3dzZU5ld0hhbmRsZXJDaGFpbkJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZVdlYlNlcnZpY2VXaWRnZXRzKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIHdlYlNlcnZpY2VUZXh0LnNldEVuYWJsZWQoZW5hYmxlKTsKLSAgICAgICAgYnJvd3NlV2ViU2VydmljZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvU3RhdHVzVXBkYXRlKCkgewotICAgICAgICBJU3RhdHVzW10gc3RhdHVzID0gbmV3IElTdGF0dXNbXSB7Ci0gICAgICAgICAgICAgICAgZkNvbnRhaW5lclN0YXR1cywKLSAgICAgICAgICAgICAgICBmUGFja2FnZVN0YXR1cywKLSAgICAgICAgICAgICAgICBmVHlwZU5hbWVTdGF0dXMsCi0gICAgICAgICAgICAgICAgZlN1cGVyQ2xhc3NTdGF0dXMsCi0gICAgICAgICAgICAgICAgZlN1cGVySW50ZXJmYWNlc1N0YXR1cywKLSAgICAgICAgICAgICAgICBzdXBlckNsYXNzSW1wbGVtZW50c1N0YXR1cywKLSAgICAgICAgICAgICAgICBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMsCi0gICAgICAgICAgICAgICAgZWRpdEhhbmRsZXJDaGFpblN0YXR1cywKLSAgICAgICAgICAgICAgICBhc3NvY2lhdGVXZWJTZXJ2aWNlU3RhdHVzCi0gICAgICAgIH07Ci0KLSAgICAgICAgdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbmZpZ3VyZUhhbmRsZXJTdGF0dXMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2YWxpZGF0ZU5ld0hhbmRsZXJDaGFpbkZpZWxkKCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUV4aXN0aW5nSGFuZGxlckNoYWluRmllbGQoKTsKLSAgICAgICAgICAgIHZhbGlkYXRlV2ViU2VydmljZUZpZWxkKCk7Ci0gICAgICAgICAgICBkb1N0YXR1c1VwZGF0ZSgpOwotICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUuZ2V0U3RhdHVzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlTmV3SGFuZGxlckNoYWluRmllbGQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlzQ29uZmlndXJlSGFuZGxlckNoYWluKCkgJiYgaXNDcmVhdGVIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgICAgIFN0cmluZyBuZXdIYW5kbGVyQ2hhaW5QYXRoID0gZ2V0TmV3SGFuZGxlckNoYWluUGF0aCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChuZXdIYW5kbGVyQ2hhaW5QYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fTkVXX0hBTkRMRVJfUEFUSF9FTVRQWSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbmV3SGFuZGxlckNoYWluUGF0aC5lbmRzV2l0aCgiLnhtbCIpKSB7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfSU5WQUxJRF9OQU1FKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0hhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPj0gMikgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNlZ21lbmV0cyA9IHBhdGguc2VnbWVudHMoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNlZ21lbmV0c1swXS5lcXVhbHMoZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9QUk9KRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5Tb3VyY2VGb2xkZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotICAgICAgICAgICAgICAgIGZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA6IHBhY2thZ2VGcmFnbWVudFJvb3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW5ldHNbMV0uZXF1YWxzKHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluU291cmNlRm9sZGVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghaW5Tb3VyY2VGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0ZJTEVfUFJPSkVDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGF0aC5sYXN0U2VnbWVudCgpICE9IG51bGwgJiYgcGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscygiLnhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9DUkVBVEVfRElBTE9HX0VNUFRZX0ZJTEVfTkFNRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5iaW5kKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19GSUxFX1BST0pFQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKHBhdGgpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuYmluZChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0NSRUFURV9ESUFMT0dfRklMRV9FWElTVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGFkZE5ld0hhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBhZGROZXdIYW5kbGVyQ2hhaW5TdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVFeGlzdGluZ0hhbmRsZXJDaGFpbkZpZWxkKCkgewotICAgICAgICBpZiAoaXNDb25maWd1cmVIYW5kbGVyQ2hhaW4oKSAmJiBpc0VkaXRIYW5kbGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgYWRkTmV3SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCA9IGdldEV4aXN0aW5nSGFuZGxlckNoYWluUGF0aCgpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChleGlzdGluZ0hhbmRsZXJDaGFpblBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fRVhJU1RJTkdfSEFORExFUl9QQVRIX0VNVFBZKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFleGlzdGluZ0hhbmRsZXJDaGFpblBhdGguZW5kc1dpdGgoIi54bWwiKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fQ1JFQVRFX0RJQUxPR19JTlZBTElEX05BTUUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChleGlzdGluZ0hhbmRsZXJDaGFpblBhdGgpOwotICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxICYmIHBhdGguc2VnbWVudCgwKS5lcXVhbHMoZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAmJiB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWRpdEhhbmRsZXJDaGFpblN0YXR1cyA9IG9rX3N0YXR1czsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRIYW5kbGVyQ2hhaW5TdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSU1lc3NhZ2VzLmJpbmQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQ09ORklHVVJBVElPTl9FRElUX0ZJTEVfTk9UX0ZPVU5ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0hhbmRsZXJDaGFpblBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBlZGl0SGFuZGxlckNoYWluU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlV2ViU2VydmljZUZpZWxkKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChpc0NvbmZpZ3VyZUhhbmRsZXJDaGFpbigpICYmIGlzQXNzb2NpYXRlSGFuZGxlckNoYWluKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyB3ZWJTZXJ2aWNlUGF0aCA9IGdldFNlbGVjdGVkV2ViU2VydmljZVBhdGgoKS50cmltKCk7Ci0gICAgICAgICAgICBpZiAod2ViU2VydmljZVBhdGgubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBhc3NvY2lhdGVXZWJTZXJ2aWNlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfUEFUSF9FTVRQWSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUod2ViU2VydmljZVBhdGgpID09IG51bGwpewotICAgICAgICAgICAgICAgIHJldHVybiBhc3NvY2lhdGVXZWJTZXJ2aWNlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fV1NfTk9UX0ZPVU5EKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFzc29jaWF0ZVdlYlNlcnZpY2VTdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gIGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFzc29jaWF0ZVdlYlNlcnZpY2VTdGF0dXMgPSBva19zdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGaWVsZENoYW5nZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgICBzdXBlci5oYW5kbGVGaWVsZENoYW5nZWQoZmllbGROYW1lKTsKLSAgICAgICAgaWYgKGZpZWxkTmFtZS5lcXVhbHMoU1VQRVIpIHx8IGZpZWxkTmFtZS5lcXVhbHMoSU5URVJGQUNFUykpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFN1cGVySW50ZXJmYWNlcygpLnNpemUoKSA9PSAwICYmIGZTdXBlckNsYXNzU3RhdHVzLmlzT0soKSkgewotICAgICAgICAgICAgICAgICAgICBJVHlwZSB0eXBlID0gZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZShnZXRTdXBlckNsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gaW50ZXJmYWNlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzdXBlckludGVyZmFjZU5hbWVzID0gQXJyYXlzLmFzTGlzdCh0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpbnRlcmZhY2VOYW1lIDogc3VwZXJJbnRlcmZhY2VOYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU5hbWVzLmFkZChTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUoaW50ZXJmYWNlTmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlTmFtZXMuY29udGFpbnMoImphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXIiKSB8fCAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VOYW1lcy5jb250YWlucygiamF2YXgueG1sLndzLmhhbmRsZXIuTG9naWNhbEhhbmRsZXIiKSkgeyAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3NJbXBsZW1lbnRzU3RhdHVzID0gb2tfc3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlckNsYXNzSW1wbGVtZW50c1N0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkFYV1NVSVBsdWdpbi5QTFVHSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9FWFRFTkRfSU1QTEVNRU5UX0hBTkRMRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3VwZXJDbGFzc0ltcGxlbWVudHNTdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhqbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZG9TdGF0dXNVcGRhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgSVN0YXR1cyBzdXBlckludGVyZmFjZXNDaGFuZ2VkKCkgewotICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLSAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQotICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaW50ZXJmYWNlTmFtZSA9ICJqYXZheC54bWwud3MuaGFuZGxlci5Mb2dpY2FsSGFuZGxlciI7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElUeXBlIHR5cGUgPSByb290LmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoaW50ZXJmYWNlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0xJQlJBUllfQ0xBU1NQQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVR5cGVNZW1iZXJzKElUeXBlIG5ld1R5cGUsIGZpbmFsIEltcG9ydHNNYW5hZ2VyIGltcG9ydHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZUluaGVyaXRlZE1ldGhvZHMobmV3VHlwZSwgZmFsc2UsIHRydWUsIGltcG9ydHMsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9PcmRlckhhbmRsZXJDaGFpblBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvamF4d3MvdWkvd2l6YXJkcy9PcmRlckhhbmRsZXJDaGFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhYWFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2pheHdzL3VpL3dpemFyZHMvT3JkZXJIYW5kbGVyQ2hhaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MudWkud2l6YXJkczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJhbWV0ZXJpemVkVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckNvbHVtbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS51dGlscy5KQVhXU0hhbmRsZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLnVpLkpBWFdTVUlQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy51aS5maWx0ZXJzLk5ld0hhbmRsZXJDaGFpblZpZXdlckZpbHRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsNCi1pbXBvcnQgb3JnLmpkb20uRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5qZG9tLkVsZW1lbnQ7DQotaW1wb3J0IG9yZy5qZG9tLkpET01FeGNlcHRpb247DQotaW1wb3J0IG9yZy5qZG9tLmlucHV0LlNBWEJ1aWxkZXI7DQotDQotcHVibGljIGNsYXNzIE9yZGVySGFuZGxlckNoYWluUGFnZSBleHRlbmRzIFdpemFyZFBhZ2Ugew0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSUNBTF9IQU5ETEVSID0gImphdmF4LnhtbC53cy5oYW5kbGVyLkxvZ2ljYWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJA0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09BUF9IQU5ETEVSID0gImphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAuU09BUEhhbmRsZXIiOyAvLyROT04tTkxTLTEkDQotDQotICAgIHByaXZhdGUgSVN0YXR1cyBva19zdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpBWFdTVUlQbHVnaW4uUExVR0lOX0lELCAiIik7ICAvLyROT04tTkxTLTEkDQotDQotICAgIHByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOw0KLQ0KLSAgICBwcml2YXRlIERvY3VtZW50IGRvYzsNCi0gICAgcHJpdmF0ZSBFbGVtZW50IHJvb3Q7DQotDQotICAgIHByaXZhdGUgSVBhdGggaGFuZGxlckNoYWluUGF0aDsNCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7DQotDQotICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWd1cmU7DQotDQotICAgIHByaXZhdGUgU3RyaW5nIG5ld0hhbmRsZXJDbGFzc05hbWU7DQotICAgIHByaXZhdGUgU3RyaW5nIG5ld0hhbmRsZXJUeXBlOw0KLQ0KLSAgICBwdWJsaWMgT3JkZXJIYW5kbGVyQ2hhaW5QYWdlKCkgew0KLSAgICAgICAgc3VwZXIoIm9yZGVyLmhhbmRsZXJjaGFpbi53aXphcmQucGFnZSIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICBzZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfT1JERVJfSEFORExFUl9XSVpBUkRfUEFHRV9USVRMRSk7DQotICAgICAgICBzZXREZXNjcmlwdGlvbihKQVhXU1VJTWVzc2FnZXMuSkFYV1NfT1JERVJfSEFORExFUl9XSVpBUkRfUEFHRV9ERVNDUklQVElPTik7DQotICAgIH0NCi0NCi0gICAgcHVibGljIE9yZGVySGFuZGxlckNoYWluUGFnZShJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsNCi0gICAgICAgIHRoaXMoKTsNCi0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluUGF0aCA9IGhhbmRsZXJDaGFpblBhdGg7DQotICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7DQotICAgICAgICB0aGlzLmNvbmZpZ3VyZSA9IHRydWU7DQotICAgIH0NCi0NCi0gICAgcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgew0KLSAgICAgICAgcmV0dXJuIGRvYzsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKCkgew0KLSAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQotICAgICAgICB0cmVlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOw0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLSAgICAgICAgZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7DQotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7DQotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOw0KLQ0KLSAgICAgICAgdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOw0KLSAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsNCi0gICAgICAgIHRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBIYW5kbGVyQ2hhaW5Db250ZW50UHJvdmlkZXIoKSk7DQotDQotICAgICAgICBUcmVlVmlld2VyQ29sdW1uIG5hbWVWaWV3ZXJDb2x1bW4gPSBuZXcgVHJlZVZpZXdlckNvbHVtbih0cmVlVmlld2VyLCBTV1QuTEVGVCk7DQotICAgICAgICBUcmVlQ29sdW1uIG5hbWVDb2x1bW4gPSBuYW1lVmlld2VyQ29sdW1uLmdldENvbHVtbigpOw0KLSAgICAgICAgbmFtZUNvbHVtbi5zZXRXaWR0aCgyMDApOw0KLSAgICAgICAgbmFtZUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7DQotICAgICAgICBuYW1lQ29sdW1uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfTkFNRV9DT0xVTU4pOw0KLQ0KLSAgICAgICAgbmFtZVZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBlbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbm9kZS5nZXRDaGlsZChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX05BTUUsIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJOYW1lRWxlbWVudCAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyTmFtZUVsZW1lbnQuZ2V0VGV4dCgpLnRyaW0oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVJfQ0hBSU4pKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlcy5JTUdfT0JKX0ZJTEUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiBjbGFzc1ZpZXdlckNvbHVtbiA9IG5ldyBUcmVlVmlld2VyQ29sdW1uKHRyZWVWaWV3ZXIsIFNXVC5MRUZUKTsNCi0gICAgICAgIFRyZWVDb2x1bW4gY2xhc3NDb2x1bW4gPSBjbGFzc1ZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsNCi0gICAgICAgIGNsYXNzQ29sdW1uLnNldFdpZHRoKDIwMCk7DQotICAgICAgICBjbGFzc0NvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7DQotICAgICAgICBjbGFzc0NvbHVtbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NMQVNTX0NPTFVNTik7DQotDQotICAgICAgICBjbGFzc1ZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb2x1bW5MYWJlbFByb3ZpZGVyKCkgew0KLQ0KLSAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBlbGVtZW50Ow0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlck5hbWVFbGVtZW50ID0gbm9kZS5nZXRDaGlsZChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NMQVNTLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyTmFtZUVsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlck5hbWVFbGVtZW50LmdldFRleHQoKS50cmltKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgVHJlZVZpZXdlckNvbHVtbiB0eXBlVmlld2VyQ29sdW1uID0gbmV3IFRyZWVWaWV3ZXJDb2x1bW4odHJlZVZpZXdlciwgU1dULkxFRlQpOw0KLSAgICAgICAgVHJlZUNvbHVtbiB0eXBlQ29sdW1uID0gdHlwZVZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsNCi0gICAgICAgIHR5cGVDb2x1bW4uc2V0V2lkdGgoMTAwKTsNCi0gICAgICAgIHR5cGVDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOw0KLSAgICAgICAgdHlwZUNvbHVtbi5zZXRUZXh0KEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX1RZUEVfQ09MVU1OKTsNCi0NCi0gICAgICAgIHR5cGVWaWV3ZXJDb2x1bW4uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsNCi0NCi0gICAgICAgICAgICBAT3ZlcnJpZGUNCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoSkFYV1NIYW5kbGVyVXRpbHMuSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDbGFzc0VsZW1lbnQgPSBub2RlLmdldENoaWxkKEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVJfQ0xBU1MsIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJDbGFzc0VsZW1lbnQgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SGFuZGxlckNsYXNzTmFtZSAhPSBudWxsICYmIG5ld0hhbmRsZXJDbGFzc05hbWUuZXF1YWxzKGhhbmRsZXJDbGFzc0VsZW1lbnQuZ2V0VmFsdWUoKS50cmltKCkpKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SGFuZGxlclR5cGU7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIGhhbmRsZXIgPSBqYXZhUHJvamVjdC5maW5kVHlwZShoYW5kbGVyQ2xhc3NFbGVtZW50LmdldFRleHQoKS50cmltKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHkgPSBoYW5kbGVyLm5ld1R5cGVIaWVyYXJjaHkoamF2YVByb2plY3QsIG51bGwpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlW10gYWxsSW50ZXJmYWNlcyA9IHR5cGVIaWVyYXJjaHkuZ2V0QWxsSW50ZXJmYWNlcygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSVR5cGUgYUludGVyZmFjZSA6IGFsbEludGVyZmFjZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFJbnRlcmZhY2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKExPR0lDQUxfSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfTE9HSUNBTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYUludGVyZmFjZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoU09BUF9IQU5ETEVSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWFdTVUlNZXNzYWdlcy5KQVhXU19QUk9UT0NPTDsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coam1lLmdldFN0YXR1cygpKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9KTsNCi0NCi0gICAgICAgIEdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7DQotICAgICAgICBncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSA2Ow0KLSAgICAgICAgdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotICAgICAgICBpZiAoY29uZmlndXJlKSB7DQotICAgICAgICAgICAgQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7DQotICAgICAgICAgICAgYWRkQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfQUREKTsNCi0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0gICAgICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotDQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZShKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX1RJVExFKTsNCi0gICAgICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19IQU5ETEVSX0NPTkZJR1VSQVRJT05fSEFORExFUl9ESUFMT0dfREVTQ1JJUFRJT04pOw0KLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldEFsbG93TXVsdGlwbGUoZmFsc2UpOw0KLSAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldElucHV0KEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7DQotDQotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuYWRkRmlsdGVyKG5ldyBOZXdIYW5kbGVyQ2hhaW5WaWV3ZXJGaWx0ZXIoamF2YVByb2plY3QsIHRydWUsIGZhbHNlKSk7DQotICAgICAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgew0KLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvblswXTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNIYW5kbGVyKGNvbXBpbGF0aW9uVW5pdCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9rX3N0YXR1czsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9DT05GSUdVUkFUSU9OX0hBTkRMRVJfRElBTE9HX0lOVkFMSUQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKQVhXU1VJUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAvLyROT04tTkxTLTEkDQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IHNlbGVjdGVkSGFuZGxlciA9IChJQ29tcGlsYXRpb25Vbml0KSBkaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRIYW5kbGVyKHNlbGVjdGVkSGFuZGxlci5maW5kUHJpbWFyeVR5cGUoKS5nZXRFbGVtZW50TmFtZSgpLA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRIYW5kbGVyLmZpbmRQcmltYXJ5VHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfSk7DQotDQotICAgICAgICAgICAgQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7DQotICAgICAgICAgICAgcmVtb3ZlQnV0dG9uLnNldFRleHQoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX0hBTkRMRVJfUkVNT1ZFKTsNCi0gICAgICAgICAgICBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOw0KLSAgICAgICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0gICAgICAgICAgICByZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotDQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotICAgICAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHNlbGVjdGVkID0gKEVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IGhhbmRsZXJDaGFpbiA9IChFbGVtZW50KSBzZWxlY3RlZC5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXJDaGFpbiAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyQ2hhaW4ucmVtb3ZlQ29udGVudChzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0pOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgQnV0dG9uIG1vdmVVcEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7DQotICAgICAgICBtb3ZlVXBCdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9NT1ZFX1VQKTsNCi0gICAgICAgIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7DQotICAgICAgICBtb3ZlVXBCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotICAgICAgICBtb3ZlVXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBzZWxlY3RlZCA9IChFbGVtZW50KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KSBzZWxlY3RlZC5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2Yoc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGluZGV4IC0gMSwgc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmRleCA9PSAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCByb290ID0gKEVsZW1lbnQpIHBhcmVudC5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGhhbmRsZXJDaGFpbnMgPSByb290LmdldENoaWxkcmVuKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcEluZGV4ID0gaGFuZGxlckNoYWlucy5pbmRleE9mKHBhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcEluZGV4ID4gMCAmJiBoYW5kbGVyQ2hhaW5zLmdldCh0b3BJbmRleCAtIDEpICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCB0b3BDaGlsZCA9IChFbGVtZW50KSBoYW5kbGVyQ2hhaW5zLmdldCh0b3BJbmRleCAtIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BDaGlsZC5nZXRDaGlsZHJlbigpLmFkZCh0b3BDaGlsZC5nZXRDaGlsZHJlbigpLnNpemUoKSwgc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIucmVmcmVzaCgpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfSk7DQotDQotICAgICAgICBCdXR0b24gbW92ZURvd25CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOw0KLSAgICAgICAgbW92ZURvd25CdXR0b24uc2V0VGV4dChKQVhXU1VJTWVzc2FnZXMuSkFYV1NfSEFORExFUl9NT1ZFX0RPV04pOw0KLSAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsNCi0gICAgICAgIG1vdmVEb3duQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOw0KLSAgICAgICAgbW92ZURvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotDQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7DQotICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBzZWxlY3RlZCA9IChFbGVtZW50KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHBhcmVudCA9IChFbGVtZW50KSBzZWxlY3RlZC5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICAgICAgICAgIExpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGNoaWxkcmVuLmluZGV4T2Yoc2VsZWN0ZWQpOw0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBjaGlsZHJlbi5zaXplKCkgLSAxKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucmVtb3ZlKHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoaW5kZXggKyAxLCBzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IGNoaWxkcmVuLnNpemUoKSAtIDEpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3QgPSAoRWxlbWVudCkgcGFyZW50LmdldFBhcmVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3QgaGFuZGxlckNoYWlucyA9IHJvb3QuZ2V0Q2hpbGRyZW4oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaEluZGV4ID0gaGFuZGxlckNoYWlucy5pbmRleE9mKHBhcmVudCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhJbmRleCA+PSAwICYmIGhJbmRleCA8IGhhbmRsZXJDaGFpbnMuc2l6ZSgpIC0gMSAmJiBoYW5kbGVyQ2hhaW5zLmdldChoSW5kZXggKyAxKSAhPSBudWxsKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZShzZWxlY3RlZCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgdG9wQ2hpbGQgPSAoRWxlbWVudCkgaGFuZGxlckNoYWlucy5nZXQoaEluZGV4ICsgMSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcENoaWxkLmdldENoaWxkcmVuKCkuYWRkKDAsIHNlbGVjdGVkKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB0cmVlVmlld2VyLnJlZnJlc2goKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLQ0KLSAgICAgICAgaWYgKGhhbmRsZXJDaGFpblBhdGggIT0gbnVsbCkgew0KLSAgICAgICAgICAgIHNldElucHV0KGhhbmRsZXJDaGFpblBhdGgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgdHJlZVZpZXdlci5leHBhbmRBbGwoKTsNCi0NCi0gICAgICAgIGNvbXBvc2l0ZS5wYWNrKCk7DQotICAgICAgICBzZXRDb250cm9sKGNvbXBvc2l0ZSk7DQotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7DQotICAgIH0NCi0NCi0NCi0gICAgQE92ZXJyaWRlDQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7DQotICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOw0KLSAgICAgICAgaWYgKHZpc2libGUpIHsNCi0gICAgICAgICAgICBzZXRJbnB1dChoYW5kbGVyQ2hhaW5QYXRoKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRIYW5kbGVyQ2hhaW5QYXRoKElQYXRoIGhhbmRsZXJDaGFpblBhdGgpIHsNCi0gICAgICAgIHRoaXMuaGFuZGxlckNoYWluUGF0aCA9IGhhbmRsZXJDaGFpblBhdGg7DQotICAgIH0NCi0NCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSGFuZGxlcihJQ29tcGlsYXRpb25Vbml0IHNvdXJjZSkgew0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCi0gICAgICAgIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsNCi0gICAgICAgIHBhcnNlci5zZXRTb3VyY2Uoc291cmNlKTsNCi0gICAgICAgIHBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7DQotICAgICAgICBDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsNCi0gICAgICAgIGNvbXBpbGF0aW9uVW5pdC5hY2NlcHQobmV3IEFTVFZpc2l0b3IoKSB7DQotICAgICAgICAgICAgQE92ZXJyaWRlDQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgew0KLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0gICAgICAgICAgICAgICAgTGlzdCBzdXBlckludGVyZmFjZXMgPSB0eXBlRGVjbGFyYXRpb24uc3VwZXJJbnRlcmZhY2VUeXBlcygpOw0KLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBzdXBlckludGVyZmFjZXMpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBvYmplY3Q7DQotICAgICAgICAgICAgICAgICAgICAgICAgSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBwYXJhbWV0ZXJpemVkVHlwZS5yZXNvbHZlQmluZGluZygpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBiaW5kaW5nLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhMT0dJQ0FMX0hBTkRMRVIpIHx8IHF1YWxpZmllZE5hbWUuZXF1YWxzKFNPQVBfSEFORExFUikpIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKHF1YWxpZmllZE5hbWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0pOw0KLSAgICAgICAgcmV0dXJuIGludGVyZmFjZXMuc2l6ZSgpID4gMDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChJUGF0aCBoYW5kbGVyQ2hhaW5QYXRoKSB7DQotICAgICAgICBpZiAoaGFuZGxlckNoYWluUGF0aCA9PSBudWxsKSB7DQotICAgICAgICAgICAgcmV0dXJuOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKCFoYW5kbGVyQ2hhaW5QYXRoLmlzRW1wdHkoKSkgew0KLSAgICAgICAgICAgIHRyeSB7DQotICAgICAgICAgICAgICAgIElGaWxlIGhhbmRsZXJDaGFpbkZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoaGFuZGxlckNoYWluUGF0aCk7DQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQNCi0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5GaWxlLmV4aXN0cygpICYmIEpBWFdTSGFuZGxlclV0aWxzLmlzSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5GaWxlKSkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBoYW5kbGVySW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGhhbmRsZXJDaGFpbkZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBidWlsZGVyLmJ1aWxkKGhhbmRsZXJJbnB1dFN0cmVhbSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGRvYy5nZXRSb290RWxlbWVudCgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVWaWV3ZXIuc2V0SW5wdXQocm9vdCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgdHJlZVZpZXdlci5leHBhbmRBbGwoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgSkFYV1NIYW5kbGVyVXRpbHMuY3JlYXRlSGFuZGxlckNoYWluRmlsZShoYW5kbGVyQ2hhaW5QYXRoKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnB1dChoYW5kbGVyQ2hhaW5QYXRoKTsNCi0gICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLSAgICAgICAgICAgICAgICBKQVhXU1VJUGx1Z2luLmxvZyhpb2UpOw0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEpET01FeGNlcHRpb24gamRvbWUpIHsNCi0gICAgICAgICAgICAgICAgSkFYV1NVSVBsdWdpbi5sb2coamRvbWUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXZhUHJvamVjdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsNCi0gICAgICAgIHRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKFN0cmluZyBuZXdIYW5kbGVyTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7DQotICAgICAgICBpZiAocm9vdCAhPSBudWxsKSB7DQotICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyQ2hhaW5FbGVtZW50ID0gcm9vdC5nZXRDaGlsZChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NIQUlOLCBKQVhXU0hhbmRsZXJVdGlscy5KQVZBRUVfTlMpOw0KLSAgICAgICAgICAgIGlmIChoYW5kbGVyQ2hhaW5FbGVtZW50ID09IG51bGwpIHsNCi0gICAgICAgICAgICAgICAgaGFuZGxlckNoYWluRWxlbWVudCA9IG5ldyBFbGVtZW50KEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVJfQ0hBSU4sIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotICAgICAgICAgICAgICAgIHJvb3QuYWRkQ29udGVudChoYW5kbGVyQ2hhaW5FbGVtZW50KTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyRWxlbWVudCA9IG5ldyBFbGVtZW50KEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVIsIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotDQotICAgICAgICAgICAgRWxlbWVudCBoYW5kbGVyTmFtZUVsZW1lbnQgPSBuZXcgRWxlbWVudChKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX05BTUUsIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotICAgICAgICAgICAgaGFuZGxlck5hbWVFbGVtZW50LnNldFRleHQobmV3SGFuZGxlck5hbWUpOw0KLQ0KLSAgICAgICAgICAgIEVsZW1lbnQgaGFuZGxlckNsYXNzRWxlbWVudCA9IG5ldyBFbGVtZW50KEpBWFdTSGFuZGxlclV0aWxzLkhBTkRMRVJfQ0xBU1MsIEpBWFdTSGFuZGxlclV0aWxzLkpBVkFFRV9OUyk7DQotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsNCi0gICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzRWxlbWVudC5zZXRUZXh0KHBhY2thZ2VOYW1lICsgIi4iICsgbmV3SGFuZGxlck5hbWUpOw0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzc0VsZW1lbnQuc2V0VGV4dChuZXdIYW5kbGVyTmFtZSk7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIGhhbmRsZXJFbGVtZW50LmFkZENvbnRlbnQoaGFuZGxlck5hbWVFbGVtZW50KTsNCi0gICAgICAgICAgICBoYW5kbGVyRWxlbWVudC5hZGRDb250ZW50KGhhbmRsZXJDbGFzc0VsZW1lbnQpOw0KLSAgICAgICAgICAgIGhhbmRsZXJDaGFpbkVsZW1lbnQuYWRkQ29udGVudChoYW5kbGVyRWxlbWVudCk7DQotICAgICAgICAgICAgdHJlZVZpZXdlci5yZWZyZXNoKCk7DQotICAgICAgICAgICAgdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oaGFuZGxlckVsZW1lbnQpKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCBhZGRIYW5kbGVyKFN0cmluZyBuZXdIYW5kbGVyTmFtZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmV3SGFuZGxlclR5cGUpIHsNCi0gICAgICAgIGFkZEhhbmRsZXIobmV3SGFuZGxlck5hbWUsIHBhY2thZ2VOYW1lKTsNCi0gICAgICAgIHRoaXMubmV3SGFuZGxlckNsYXNzTmFtZSA9IHBhY2thZ2VOYW1lICsgIi4iICsgbmV3SGFuZGxlck5hbWU7DQotICAgICAgICB0aGlzLm5ld0hhbmRsZXJUeXBlID0gbmV3SGFuZGxlclR5cGU7DQotICAgICAgICBpZiAobmV3SGFuZGxlclR5cGUuZXF1YWxzKEpBWFdTVUlNZXNzYWdlcy5KQVhXU19MT0dJQ0FMX0hBTkRMRVIpKSB7DQotICAgICAgICAgICAgdGhpcy5uZXdIYW5kbGVyVHlwZSA9IEpBWFdTVUlNZXNzYWdlcy5KQVhXU19MT0dJQ0FMOw0KLSAgICAgICAgfSBlbHNlIGlmIChuZXdIYW5kbGVyVHlwZS5lcXVhbHMoSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX1NPQVBfSEFORExFUikpIHsNCi0gICAgICAgICAgICB0aGlzLm5ld0hhbmRsZXJUeXBlID0gSkFYV1NVSU1lc3NhZ2VzLkpBWFdTX1BST1RPQ09MOw0KLSAgICAgICAgfQ0KLSAgICB9DQotDQotICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlckNoYWluQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgew0KLQ0KLSAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7DQotICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnRFbGVtZW50Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRDaGlsZHJlbigpLnRvQXJyYXkoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7DQotICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7DQotICAgICAgICAgICAgICAgIEVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBlbGVtZW50Ow0KLSAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRQYXJlbnQoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgcmV0dXJuIG51bGw7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgew0KLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgew0KLSAgICAgICAgICAgICAgICBFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgZWxlbWVudDsNCi0gICAgICAgICAgICAgICAgaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhKQVhXU0hhbmRsZXJVdGlscy5IQU5ETEVSX0NIQUlOKSkgew0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPiAwOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7DQotICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsNCi0gICAgICAgICAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGlucHV0RWxlbWVudDsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKS50b0FycmF5KCk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10ge307DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7DQotICAgICAgICB9DQotICAgIH0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E5OTA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlsczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFlMDQ4NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0YjI0MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscztzaW5nbGV0b246PXRydWUNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UudWkuaWRlLA0KLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6LA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZG9tLnZhbGlkYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzIiwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMNCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luLkpheHdzVXRpbHNQbHVnaW4NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxMGFmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAxNSwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYWFlMjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDU0YjQwZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1VdGlsc1BsdWdpbiAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAyOTMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+DQotPCEtLQ0KLSAgICBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICAgDQotICAgIENvbnRyaWJ1dG9yczoNCi0gICAgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAtLT4NCi0NCi08cGx1Z2luPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuc3RhcnR1cCI+DQotICAgICAgPHN0YXJ0dXA+PC9zdGFydHVwPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL0NvbnRyYWN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjEzYjhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvQ29udHJhY3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLQ0KLS8qKg0KLSAqIENvbnRhaW5zIGNoZWNrcyBmcmVxdWVudGx5IGFwcGxpZWQgb24gcGFyYW1ldGVycy4NCi0gKiANCi0gKiBAYXV0aG9yIEpvZXJnIERlaG1lbA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cmFjdENoZWNrZXINCi17DQotCXByaXZhdGUgQ29udHJhY3RDaGVja2VyKCkNCi0Jew0KLQkJLy8gcHJldmVudCBpbnN0YW50aWF0aW9uIGZyb20gb3V0c2lkZQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5OdWxsUG9pbnRlckV4Y2VwdGlvbjwvY29kZT4NCi0JICogaW4gdGhpcyBjYXNlLg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAcGFyYW0gcGFyYW1OYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlciwgdXNlZCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXINCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gZWl0aGVyIHRoZSBwYXJhbVZhbHVlIG9yIHBhcmFtTmFtZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tQYXJhbShmaW5hbCBPYmplY3QgcGFyYW1WYWx1ZSwgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSkNCi0Jew0KLQkJaWYgKHBhcmFtTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW1OYW1lIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJCANCi0JCX0NCi0JCWlmIChwYXJhbVZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKHBhcmFtTmFtZSArICIgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhcmFtZXRlciB2YWx1ZSBpcyBudWxsIGFuZCByZXBvcnRzIGFuIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBwYXJhbVZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1BhcmFtKGZpbmFsIE9iamVjdCBwYXJhbVZhbHVlKQ0KLQl7DQotCQlpZiAocGFyYW1WYWx1ZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW1WYWx1ZSBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmllbGQgdmFsdWUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIGZpZWxkVmFsdWUgdGhlIHZhbHVlIHRvIGJlIGNoZWNrZWQNCi0JICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBmaWVsZCwgdXNlZCB0byByZXBvcnQgdGhlIHByb2JsZW0gdG8gdGhlIHVzZXINCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIGZpZWxkTmFtZSBpcyBudWxsDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGRWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tGaWVsZChmaW5hbCBPYmplY3QgZmllbGRWYWx1ZSwgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkNCi0Jew0KLQkJaWYgKGZpZWxkTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmllbGROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsgIC8vJE5PTi1OTFMtMSQgIA0KLQkJfQ0KLQkJaWYgKGZpZWxkVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGZpZWxkTmFtZSArICIgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGZpZWxkIHZhbHVlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSBmaWVsZFZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgZmllbGRWYWx1ZSBpcyBudWxsICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBudWxsQ2hlY2tGaWVsZChmaW5hbCBPYmplY3QgZmllbGRWYWx1ZSkNCi0Jew0KLQkJaWYgKGZpZWxkVmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmaWVsZFZhbHVlIG11c3Qgbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUgaXMgbnVsbCBhbmQgcmVwb3J0cyBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+DQotCSAqIGluIHRoaXMgY2FzZS4NCi0JICogQHBhcmFtIHZhclZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkDQotCSAqIEBwYXJhbSB2YXJOYW1lIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLCB1c2VkIHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB0aGUgdXNlcg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyTmFtZSBpcyBudWxsDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgdmFyVmFsdWUgaXMgbnVsbCAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbnVsbENoZWNrVmFyaWFibGUoZmluYWwgT2JqZWN0IHZhclZhbHVlLCBmaW5hbCBTdHJpbmcgdmFyTmFtZSkNCi0Jew0KLQkJaWYgKHZhck5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhck5hbWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQkJaWYgKHZhclZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih2YXJOYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBvZiBhIGxvY2FsIHZhcmlhYmxlIGlzIG51bGwgYW5kIHJlcG9ydHMgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPg0KLQkgKiBpbiB0aGlzIGNhc2UuDQotCSAqIEBwYXJhbSB2YXJWYWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZA0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHZhclZhbHVlIGlzIG51bGwgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIG51bGxDaGVja1ZhcmlhYmxlKGZpbmFsIE9iamVjdCB2YXJWYWx1ZSkNCi0Jew0KLQkJaWYgKHZhclZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidmFyVmFsdWUgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBUaGlzIG1ldGhvZCBjaGVja3MgaWYgPGNvZGU+cGFyYW08L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IHN0cmluZy4NCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSB2YXJOYW1lDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT5wYXJhbTwvY29kZT4gaXMgZW1wdHkgc3RyaW5nIG9yIGNvbnRhaW5zIG9ubHkNCi0JICogd2hpdGUgc3BhY2UgY2hhcmFjdGVycw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGVtcHR5U3RyaW5nQ2hlY2tQYXJhbShmaW5hbCBTdHJpbmcgcGFyYW0sIGZpbmFsIFN0cmluZyB2YXJOYW1lKSANCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocGFyYW0sIHZhck5hbWUpOw0KLQkJDQotCQlpZiAocGFyYW0udHJpbSgpLmxlbmd0aCgpID09IDApIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJQYXJhbWV0ZXIgezB9IGlzIGVtcHR5IHN0cmluZyBvciBjb250YWlucyBvbmx5IHdoaXRlIHNwYWNlcyIsIHZhck5hbWUpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvSmF4V3NVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZGRlN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9KYXhXc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgdGhhdCBjb250YWlucyBKQVgtV1MgcmVsZWF0ZWQgZnVuY3Rpb25hbGl0eQ0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEpheFdzVXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCRUFOX1NVRkZJWCA9ICJCZWFuIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9SVF9TVUZGSVggPSAiUG9ydCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfU1VGRklYID0gIlNlcnZpY2UiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIEpheFdzVXRpbHMoKQ0KLQl7DQotCQkvLyBoaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JfQ0KLQ0KLQkvKioNCi0JICogQW4gdXRpbGl0eSBtZXRob2QgZm9yIGNvbXBvc2luZyBhIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSBmb3IgSmF4V3MgY3VzdG9taXphdGlvbg0KLQkgKiBvdXQgb2YgYSBwYWNrYWdlIG5hbWUuDQotCSAqIEFsZ29yaXRobToNCi0JICogPGxpPkluIGNhc2UgdGhlIHBhY2thZ2UgaGFzIDAgZnJhZ21lbnQgKGRlZmF1bHQgcGFja2FnZSkgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vLzwvbGk+DQotCSAqIDxsaT5JbiBjYXNlIHRoZSBwYWNrYWdlIGhhcyAxIGZyYWdtZW50IHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovL2ZyYWdtZW50MS88L2xpPg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgMiBmcmFnbWVudHMgdGhlIHJlc3VsdCB3b3VsZCBiZSBodHRwOi8vZnJhZ21lbnQyLmZyYWdtZW50MS88L2xpPg0KLQkgKiA8bGk+SW4gY2FzZSB0aGUgcGFja2FnZSBoYXMgbW9yZSB0aGFuIDIgZnJhZ21lbnRzIHRoZSByZXN1bHQgd291bGQgYmUgaHR0cDovL2ZyYWdtZW50Mi5mcmFnbWVudDEvZnJhZ21lbnQzL2ZyYWdtZW50NC8uLi4vZnJhZ21lbnRuLzwvbGk+DQotCSAqIEBwYXJhbSBwYWNrYWdlTmFtZSBOYW1lIG9mIHRoZSBwYWNrYWdlDQotCSAqIEByZXR1cm4gdGhlIGNvbXBvc2VkIG5hbWVzcGFjZQ0KLQkgKiBAdGhvcndzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gcGFja2FnZSBuYW1lIHNwZWNpZmllZCBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKQ0KLQl7DQotCQlpZihwYWNrYWdlTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUGFja2FnZSBuYW1lIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJU3RyaW5nW10gcGtnRnJhZ21lbnRzID0gcGFja2FnZU5hbWUuc3BsaXQoIlxcLiIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWlmKHBrZ0ZyYWdtZW50cy5sZW5ndGggPiAxKQ0KLQkJew0KLQkJCS8vIHJldmVyc2UgdGhlIGZpcnN0IHR3byBmcmFnbWVudHMgaW4gY2FzZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGZyYWdtZW50cyBhdmFpbGFibGUNCi0JCQlTdHJpbmcgZnJhZzAgPSBwa2dGcmFnbWVudHNbMF07DQotCQkJcGtnRnJhZ21lbnRzWzBdID0gcGtnRnJhZ21lbnRzWzFdOw0KLQkJCXBrZ0ZyYWdtZW50c1sxXSA9IGZyYWcwOw0KLQkJfQ0KLQkJDQotCQlTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJodHRwOi8vIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGtnRnJhZ21lbnRzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXJlc3VsdC5hcHBlbmQocGtnRnJhZ21lbnRzW2ldKTsNCi0JCQlyZXN1bHQuYXBwZW5kKGk9PTAgJiYgcGtnRnJhZ21lbnRzLmxlbmd0aD4xID8gIi4iIDogIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNhbWUgYXMgY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCkgYnV0IGZpcnN0IGV4dHJhY3RzIHRoZSBwYWNrYWdlIG91dCBvZiBjbGFzcw0KLQkgKiBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKiBAcGFyYW0gZnFOYW1lIHRoZSBjbGFzcyBmdWxseSBxdWFsaWZpZWQgbmFtZQ0KLQkgKiBAcmV0dXJuIGNhbGN1bGF0ZWQgdGFyZ2V0IG5hbWVzcGFjZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlGUU5hbWUoU3RyaW5nIGZxTmFtZSkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZxTmFtZSwgImZxTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKGV4dHJhY3RQYWNrYWdlKGZxTmFtZSkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgUG9ydFR5cGUgbmFtZSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGFuZCA8Y29kZT5zZWlOYW1lPC9jb2RlPi4NCi0JICogQHBhcmFtIGVuZHBvaW50IGNsYXNzLg0KLQkgKiBAcGFyYW0gc2VpTmFtZQ0KLQkgKiBAcmV0dXJuIFBvcnRUeXBlIG5hbWUgZm9yIHRoZSBAV2ViU2VydmljZSBhbm5vdGF0aW9uLCB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiB3aXRoIHRoZSAiUG9ydCIgc3VmZml4Lg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbC4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBvcnR0eXBlTmFtZShJVHlwZSBlbmRwb2ludFR5cGUsIFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlpZihlbmRwb2ludFR5cGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYoc2VpTmFtZSAhPSBudWxsICYmIHNlaU5hbWUubGVuZ3RoKCkgPiAwKQ0KLQkJew0KLQkJCXJldHVybiBzZWlOYW1lOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyB0aGUgIkJlYW4iIHN1ZmZpeCBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IGluIGNhc2UgaXQgaXMgcHJlc2VudCBhbmQgZ2VuZXJhdGVzIFNlcnZpY2UgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBJVHlwZS4NCi0JICogQHBhcmFtIGVuZHBvaW50IGNsYXNzLg0KLQkgKiBAcmV0dXJuIFNlcnZpY2UgbmFtZSBmb3IgdGhlIEBXZWJTZXJ2aWNlIGFubm90YXRpb24sIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+IHdpdGhvdXQgdGhlICJCZWFuIiBzdWZmaXggYW5kIDxjb2RlPiJTZXJ2aWNlIjwvY29kZT4gYXQgdGhlIGVuZC4NCi0JICogSW4gY2FzZSB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBlcXVhbHMgIkJlYW4iIHRoZW4gdGhlIG9yaWdpbmFsIG5hbWUgaXMgcmV0dXJuZWQgd2l0aCA8Y29kZT4iU2VydmljZSI8L2NvZGU+IGF0ZSB0aGUgZW5kLg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gPGNvZGU+ZW5kcG9pbnRUeXBlPC9jb2RlPiBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmljZU5hbWUoZmluYWwgSVR5cGUgZW5kcG9pbnRUeXBlKQ0KLQl7DQotCQlpZihlbmRwb2ludFR5cGUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpICsgU0VSVklDRV9TVUZGSVg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgdGhlICJCZWFuIiBzdWZmaXggZnJvbSB0aGUgZW5kcG9pbnQgbmFtZSBpbiBjYXNlIGl0IGlzIHByZXNlbnQuICANCi0JICogQHBhcmFtIGVuZHBvaW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQNCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQgd2l0aG91dCB0aGUgIkJlYW4iIHN1ZmZpeC4gSW4gY2FzZSB0aGUgbmFtZSBvZiB0aGUgZW5kcG9pbnQgZXF1YWxzICJCZWFuIiB0aGVuIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHJldHVybmVkDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQmVhblN1ZmZpeElmUmVxdWlyZWQoZmluYWwgU3RyaW5nIGVuZHBvaW50TmFtZSkNCi0Jew0KLQkJYXNzZXJ0IGVuZHBvaW50TmFtZSAhPSBudWxsICYmIGVuZHBvaW50TmFtZS5sZW5ndGgoKSA+IDA7DQotCQkNCi0JCWlmKGVuZHBvaW50TmFtZS5lcXVhbHMoQkVBTl9TVUZGSVgpKQ0KLQkJew0KLQkJCXJldHVybiBlbmRwb2ludE5hbWU7DQotCQl9DQotCQkNCi0JCWlmKGVuZHBvaW50TmFtZS5lbmRzV2l0aChCRUFOX1NVRkZJWCkpDQotCQl7DQotCQkJcmV0dXJuIGVuZHBvaW50TmFtZS5zdWJzdHJpbmcoMCwgZW5kcG9pbnROYW1lLmxhc3RJbmRleE9mKEJFQU5fU1VGRklYKSk7DQotCQl9DQotCQkNCi0JCXJldHVybiBlbmRwb2ludE5hbWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIFBvcnQgbmFtZSBmcm9tIHRoZSA8Y29kZT5lbmRwb2ludFR5cGU8L2NvZGU+Lg0KLQkgKiBAcGFyYW0gZW5kcG9pbnQgY2xhc3MuDQotCSAqIEByZXR1cm4gUG9ydCBuYW1lIGZvciB0aGUgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiwgdGhlIG5hbWUgb2YgdGhlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gd2l0aCB0aGUgIlBvcnQiIHN1ZmZpeC4NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gc3BlY2lmaWVkIGlzIG51bGwuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQb3J0TmFtZShmaW5hbCBJVHlwZSBlbmRwb2ludFR5cGUpDQotCXsNCi0JCXJldHVybiBnZXREZWZhdWx0UG9ydE5hbWUoZW5kcG9pbnRUeXBlLmdldEVsZW1lbnROYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUgY2FsY3VsYXRlZCBhcyB0aGUgc3BlY2lmaWNhdGlvbiBzdGF0ZXMuDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmVuZHBvaW50VHlwZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRTZXJ2aWNlTmFtZShmaW5hbCBTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlpZihmcU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImVuZHBvaW50VHlwZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpICsgU0VSVklDRV9TVUZGSVg7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHdzZGw6cG9ydFR5cGUgbmFtZSBkZWZpbmVkIGFzIEpBWC1XUyBzcGVjaWZpY2F0aW9uIHN0YXRlcy4gDQotCSAqIEBwYXJhbSBmcU5hbWUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShmaW5hbCBTdHJpbmcgZnFOYW1lKQ0KLQl7DQotCQlpZihmcU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZxTmFtZSBjb3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUgZm9yIGEgd3NkbDpwb3J0IGRlZmluZWQgYXMgSkFYLVdTIHNwZWNpZmljYXRpb24gc3RhdGVzIA0KLQkgKiBAcGFyYW0gZnFOYW1lDQotCSAqIEByZXR1cm4gdGhlIGNhbGN1bGF0ZWQgbmFtZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBvcnROYW1lKGZpbmFsIFN0cmluZyBmcU5hbWUpDQotCXsNCi0JCWlmKGZxTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZnFOYW1lIGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gZXh0cmFjdFNob3J0TmFtZShmcU5hbWUpICsgUE9SVF9TVUZGSVg7DQotCX0JDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFNob3J0TmFtZShTdHJpbmcgZnFOYW1lKSANCi0Jew0KLQkJaW50IHBvcyA9IGZxTmFtZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKHBvcyA9PS0xICkgew0KLQkJCXJldHVybiBmcU5hbWU7DQotCQl9DQotCQkNCi0JCXJldHVybiBmcU5hbWUuc3Vic3RyaW5nKHBvcysxKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RQYWNrYWdlKGZpbmFsIFN0cmluZyBmcU5hbWUpIA0KLQl7DQotCQlpbnQgcG9zID0gZnFOYW1lLmxhc3RJbmRleE9mKCcuJyk7DQotCQlpZiAocG9zID09LTEgKSB7DQotCQkJcmV0dXJuIGZxTmFtZTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZxTmFtZS5zdWJzdHJpbmcoMCwgcG9zKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL1N0YXR1c1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNzc5YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9TdGF0dXNVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLQ0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgdG8gbWFuYWdlIHN0YXR1cyBvYmplY3RzLg0KLSAqIA0KLSAqIEBhdXRob3IgSm9lcmcgRGVobWVsDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFN0YXR1c1V0aWxzDQotew0KLQlwcml2YXRlIFN0YXR1c1V0aWxzKCkNCi0Jew0KLQkJLy8gbm8gaW5zdGFudGlhdGlvbg0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMgdGhlIG1vc3Qgc2V2ZXJlIHN0YXR1cyBmcm9tIGEgYXJyYXkgb2Ygc3RhdGkuDQotCSAqIEFuIGVycm9yIGlzIG1vcmUgc2V2ZXJlIHRoYW4gYSB3YXJuaW5nLCBhbmQgYSB3YXJuaW5nIGlzIG1vcmUgc2V2ZXJlDQotCSAqIHRoYW4gb2suDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZ2V0TW9zdFNldmVyZShJU3RhdHVzW10gc3RhdHVzKSB7DQotCQlJU3RhdHVzIG1heD0gbnVsbDsNCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsNCi0JCQlJU3RhdHVzIGN1cnI9IHN0YXR1c1tpXTsNCi0JCQlpZiAoY3Vyci5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7DQotCQkJCXJldHVybiBjdXJyOw0KLQkJCX0NCi0JCQlpZiAobWF4ID09IG51bGwgfHwgY3Vyci5nZXRTZXZlcml0eSgpID4gbWF4LmdldFNldmVyaXR5KCkpIHsNCi0JCQkJbWF4PSBjdXJyOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBtYXg7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5DQU5DRUwuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIHN0YXR1cyBtZXNzYWdlDQotCSAqIEByZXR1cm4gdGhlIGNhbmNlbCBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNDYW5jZWwoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIG1lc3NhZ2UpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5FUlJPUi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3RhdHVzRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLkVSUk9SLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gZXgNCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgc3RhdHVzDQotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0Vycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXgpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZXgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5XQVJOSU5HLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5nIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c1dhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuV0FSTklORy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHBhcmFtIGV4DQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN0YXR1cw0KLQkgKiBAcmV0dXJuIHRoZSB3YXJuaW5nIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c1dhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBleCkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UsIGV4KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUHJvdmlkZXMgYSBuZXcgc3RhdHVzIG9iamVjdCB3aXRoIHNldmVyaXR5IElTdGF0dXMuSU5GTy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgc3RhdHVzIG1lc3NhZ2UNCi0JICogQHJldHVybiB0aGUgaW5mbyBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNJbmZvKGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuSU5GTywgbWVzc2FnZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBQcm92aWRlcyBhIG5ldyBzdGF0dXMgb2JqZWN0IHdpdGggc2V2ZXJpdHkgSVN0YXR1cy5JTkZPLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBpbmZvIHN0YXR1cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHN0YXR1c0luZm8oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLklORk8sIG1lc3NhZ2UsIGNhdXNlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IHN0YXR1cyBvYmplY3Qgd2l0aCBzZXZlcml0eSBJU3RhdHVzLk9LLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIHRoZSBvayBzdGF0dXMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBzdGF0dXNPayhmaW5hbCBTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBtZXNzYWdlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhmaW5hbCBpbnQgc2V2ZXJpdHksIGZpbmFsIFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgImlkIiwgMCwgbWVzc2FnZSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhmaW5hbCBpbnQgc2V2ZXJpdHksIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXgpDQotCXsNCi0JCXJldHVybiBuZXcgU3RhdHVzKHNldmVyaXR5LCAiaWQiLCAwLCBtZXNzYWdlLCBleCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIGEgbmV3IG11bHRpc3RhdHVzIG9iamVjdA0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBzdGF0dXMgbWVzc2FnZQ0KLQkgKiBAcmV0dXJuIG11bHRpc3RhdHVzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIE11bHRpU3RhdHVzIGNyZWF0ZU11bHRpU3RhdHVzKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKCJpZCIsIDAsIG1lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZjJmZDM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW07DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5Bbm5vdGF0aW9uSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkluc3BlY3RvckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXJyYXlWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkJvb2xlYW5WYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkNsYXNzVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5JbnRlZ2VyVmFsdWVJbXBsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5QYXJhbVZhbHVlUGFpckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlF1YWxpZmllZE5hbWVWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi0NCi0NCi0vKioNCi0gKiBGYWN0b3J5IGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGZhY3RvcnkgYW5kIHV0aWxpdHkgbWV0aG9kcyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25GYWN0b3J5DQotew0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IEFubm90YXRpb24sIGUuZy4gQW5ub3RhdGlvbiBvZiBraW5kIFxAV2ViU2VydmljZShwYXJhbTE9InZhbHVlMSIsIHBhcmFtMj0idmFsdWUyIikuDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvblFOYW1lDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMNCi0JICogDQotCSAqIEByZXR1cm4gSW5zdGFudGlhdGVkIEFubm90YXRpb24gb2YgdHlwZSBJQ29tcGxleEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPHR0PmFubm90YXRpb25RTmFtZTwvdHQ+IG9yIDx0dD5wYXJhbVZhbHVlUGFpcnM8L3R0PiBhcmUgbnVsbC4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSA8dHQ+YW5ub3RhdGlvblFOYW1lPC90dD4gaXMgZW1wdHkgU3RyaW5nLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvblFOYW1lLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGZpbmFsIFQgYXBwbGllZEVsZW1lbnQpDQotCXsNCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmIChhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAocGFyYW1WYWx1ZVBhaXJzID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbVZhbHVlUGFpcnMgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBBbm5vdGF0aW9uSW1wbDxUPiBpbXBsID0gbmV3IEFubm90YXRpb25JbXBsPFQ+KGFubm90YXRpb25RTmFtZSwgcGFyYW1WYWx1ZVBhaXJzKTsNCi0JCWltcGwuc2V0SmF2YUVsZW1lbnQoYXBwbGllZEVsZW1lbnQpOw0KLQkJDQotCQlyZXR1cm4gaW1wbDsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UgdGhhdCByZWZlcmVuY2VzIDxjb2RlPmFwcGxpZWRFbGVtZW50PC9jb2RlPiBqYXZhIGVsZW1lbnQgDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgdGhlIGFubm90YXRpb24gbmFtZQ0KLQkgKiBAcGFyYW0gYXBwbGllZEVsZW1lbnQgdGhlIGphdmEgZWxlbWVudCB0aGF0IHRoaXMgYW5ub3RhdGlvbiBpcyBhcHBsaWVkIG9uDQotCSAqIEBwYXJhbSBwYXJhbVZhbHVlUGFpcnMgdGhlIGFubm90YXRpb24gYXR0cmlidXRlcw0KLQkgKiBAcmV0dXJuIHtAbGluayBJQW5ub3RhdGlvbn0gaW5zdGFuY2UNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHNvbWUgb2YgcGFyYW1zIGlzIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBzdHJpbmcNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvblFOYW1lLCBJSmF2YUVsZW1lbnQgYXBwbGllZEVsZW1lbnQsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlycykNCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0oYW5ub3RhdGlvblFOYW1lLCAiYW5ub3RhdGlvblFOYW1lIik7CSAvLyROT04tTkxTLTEkCQ0KLQkJaWYgKGFubm90YXRpb25RTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBzaG91bGQgbm90IGJlIGVtcHR5IFN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJbnVsbENoZWNrUGFyYW0ocGFyYW1WYWx1ZVBhaXJzLCAicGFyYW1WYWx1ZVBhaXJzIik7IC8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGFwcGxpZWRFbGVtZW50LCAiYXBwbGllZEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJZmluYWwgQW5ub3RhdGlvbkltcGw8SUphdmFFbGVtZW50PiBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElKYXZhRWxlbWVudD4oYW5ub3RhdGlvblFOYW1lLCBwYXJhbVZhbHVlUGFpcnMpOw0KLQkJYW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGFwcGxpZWRFbGVtZW50KTsNCi0JCQ0KLQkJcmV0dXJuIGFubm90YXRpb247DQotCX0JDQotCQ0KLQkvKioNCi0JKiBDcmVhdGVzIHBhcmFtLXZhbHVlIHBhaXIgbmVlZGVkIGluIGNvbXBsZXggQW5ub3RhdGlvbnMuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyYW0NCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIElQYXJhbVZhbHVlUGFpcg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT52YWx1ZTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+cGFyYW08L2NvZGU+IHBhcmFtZXRlciBpcyBlbXB0eSBTdHJpbmcuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElQYXJhbVZhbHVlUGFpciBjcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKFN0cmluZyBwYXJhbSwgSVZhbHVlIHZhbHVlKQ0KLQl7DQotCQlpZiAocGFyYW0gPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhcmFtIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKHBhcmFtLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBQYXJhbVZhbHVlUGFpckltcGwocGFyYW0sIHZhbHVlKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgPGNvZGU+dmFsdWVzPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZXMNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8Y29kZT52YWx1ZXM8L2NvZGU+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+dmFsdWVzPC9jb2RlPiBpcyBlbXB0eSBTZXQuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVBcnJheVZhbHVlKFNldDxJVmFsdWU+IHZhbHVlcykNCi0Jew0KLQkJaWYgKHZhbHVlcyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmFsdWVzIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYgKHZhbHVlcy5zaXplKCkgPCAxKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlcyBzaG91bGQgbm90IGJlIGVtcHR5IFNldCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgSVZhbHVlfSBpbnN0YW5jZSBvdXQgb2YgPGNvZGU+dmFsdWU8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVCb29sZWFuVmFsdWUoYm9vbGVhbiB2YWx1ZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBCb29sZWFuVmFsdWVJbXBsKHZhbHVlKTsNCi0JfQ0KLQkJDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUNsYXNzVmFsdWUoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYodmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG5ldyBDbGFzc1ZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICogDQotCSAqIEByZXR1cm4gaW5zdGFuY2Ugb2Yge0BsaW5rIElWYWx1ZX0NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVZhbHVlIGNyZWF0ZUludGVnZXJWYWx1ZShTdHJpbmcgdmFsdWUpDQotCXsNCi0JCXJldHVybiBuZXcgSW50ZWdlclZhbHVlSW1wbCh2YWx1ZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMge0BsaW5rIElWYWx1ZX0gaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gZnVsbHkgcXVhbGlmaWVkIG5hbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgPHR0PnF1YWxpZmllZE5hbWU8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPnF1YWxpZmllZE5hbWU8L2NvZGU+IGlzIG5vdCBpbiBjb3JyZWN0IGZvcm0gZS5nLiBjb3VsZCBub3QgYmUgZW1wdHkgU3RyaW5nLCBzaG9sZCBiZSBxdWFsaWZpZWQuDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElWYWx1ZSBjcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpDQotCXsNCi0JCWlmIChxdWFsaWZpZWROYW1lID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJxdWFsaWZpZWROYW1lIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKHF1YWxpZmllZE5hbWUudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcXVhbGlmaWVkTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVhbGlmaWVkTmFtZSBpcyBub3QgaW4gY29ycmVjdCBmb3JtISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gbmV3IFF1YWxpZmllZE5hbWVWYWx1ZUltcGwocXVhbGlmaWVkTmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIHtAbGluayBJVmFsdWV9IGluc3RhbmNlIG91dCBvZiA8Y29kZT52YWx1ZTwvY29kZT4gY29udGVudC4NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAbGluayBJVmFsdWV9DQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSA8dHQ+dmFsdWU8L3R0PiBpcyBudWxsLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVmFsdWUgY3JlYXRlU3RyaW5nVmFsdWUoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlpZiAodmFsdWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZhbHVlIHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG5ldyBTdHJpbmdWYWx1ZUltcGwodmFsdWUpOw0KLQl9DQotCQ0KLQkNCi0vLwkvKioNCi0vLwkgKiBSZXRyaWV2ZXMgYWxsIEFubm90YXRpb25zIGZyb20gY2xhc3MuDQotLy8JICogDQotLy8JICogQHBhcmFtIGphdmFFbGVtZW50DQotLy8JICoNCi0vLwkgKiBAcmV0dXJuIGNvbnRhaW5lZCBhbm5vdGF0aW9ucyBpbiA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4NCi0vLwkgKiANCi0vLwkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBleGNlcHRpb24gb2NjdXJzDQotLy8JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLS8vCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLS8vCSAqLw0KLS8vCXB1YmxpYyBzdGF0aWMgU2V0PElBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0vLwl7DQotLy8JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLS8vCQl7DQotLy8JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsNCi0vLwkJfQ0KLS8vCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpIHx8ICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKSB8fCAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSB8fCAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLS8vCQl7DQotLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOw0KLS8vCQl9DQotLy8JCXBwcHBwcA0KLS8vCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmVzIGFsbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmIChqYXZhRWxlbWVudCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiamF2YUVsZW1lbnQgc2hvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZighKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpICYmICEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSUZpZWxkKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImphdmFFbGVtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJlbW92ZUFubm90YXRpb25zKGphdmFFbGVtZW50LCBudWxsKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgQW5ub3RhdGlvbnMgd2l0aCBuYW1lcyBjb250YWluZWQgaW4gPGNvZGU+YW5ub3RhdGlvbnM8L2NvZGU+IGZyb20gPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGFuZCBpdHMgY2hpbGRyZW4sIGlmIHN1Y2ggZXhpc3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogQHBhcmFtIGFubm90YXRpb25zDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IG9yIDx0dD5hbm5vdGF0aW9uczwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlcg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbm5vdGF0aW9ucyhJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0cnkgDQotCQl7DQotCQkJQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkucmVtb3ZlQW5ub3RhdGlvbnMoamF2YUVsZW1lbnQsIGFubm90YXRpb25zLCB0cnVlKTsNCi0JCX0gDQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkludmFsaWRUcmVlU3RhdGVNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGUgaW5zdGFuY2Ugb2YgSUFubm90YXRpb25JbnNwZWN0b3IgZm9yIGEgc3BlY2lmaWMgSVR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSAtIElUeXBlLCB3aGljaCB3aWxsIGJlIGluc3BlY3RlZC4NCi0JICogIA0KLQkgKiBAcmV0dXJuIElBbm5vdGF0aW9uSW5zcGVjdG9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElBbm5vdGF0aW9uSW5zcGVjdG9yIGNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCh0eXBlKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0Fubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTU4YTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb24uTG9jYWxpemVkRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB0aHJvd24gYnkgYW5ub3RhdGlvbiBnZW5lcmF0b3IgaW4gY2FzZSB3aGVuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIGlzIG1ldA0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIGV4dGVuZHMgTG9jYWxpemVkRXhjZXB0aW9uDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGdldHRpbmcgZXJyb3IgbWVzc2FnZSwgbG9jYWxpemVkIG1lc3NhZ2UgYW5kIHtAbGluayBUaHJvd2FibGV9IHRvIGJlIHdyYXBwZWQNCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIA0KLQkgKiBAcGFyYW0gdA0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgdCkNCi0Jew0KLQkJc3VwZXIobWVzc2FnZSwgbG9jYWxpemVkTWVzc2FnZSwgdCk7CQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciB3aXRoIGVycm9yIG1lc3NhZ2UgYW5kIGEgbG9jYWxpemVkIG1lc3NhZ2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiBAcGFyYW0gbG9jYWxpemVkTWVzc2FnZQ0KLQkgKi8NCi0JcHVibGljIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKQ0KLQl7DQotCQlzdXBlcihtZXNzYWdlLCBsb2NhbGl6ZWRNZXNzYWdlKTsJCQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbldyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmMDczMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25VdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLnRleHQuSmF4V3NVdGlsTWVzc2FnZXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRWRpdFJlc291cmNlc01hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsNCi0NCi0vKioNCi0gKiBDbGFzcywgd2hpY2ggaXMgdXNlZCB0byBzYXZlIHRoZSBhbm5vdGF0aW9ucy4NCi0gKiANCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uV3JpdGVyDQotew0KLQlwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uV3JpdGVyIHdyaXRlciA9IG51bGw7DQotCXByaXZhdGUgZmluYWwgSUZpbGVVdGlscyBmaWxlVXRpbHMgPSBGaWxlVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIFRoZSBmYWN0b3J5IG1ldGhvZC4NCi0JICogDQotCSAqIEByZXR1cm4gYSBBbm5vdGF0aW9uV3JpdGVyIGluc3RhbmNlLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYzxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBBbm5vdGF0aW9uV3JpdGVyIGdldEluc3RhbmNlKCkNCi0Jew0KLQkJaWYgKHdyaXRlciA9PSBudWxsKQ0KLQkJew0KLQkJCXdyaXRlciA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKCk7DQotCQl9DQotCQlyZXR1cm4gd3JpdGVyOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQWRkcyBBbm5vdGF0aW9uIHRvIHNwZWNpZmljIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSVR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXIuDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbi4NCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBzZXRBcHBsaWVkRWxlbWVudChmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCA9IChBbm5vdGF0aW9uSW1wbDxUPilhbm5vdGF0aW9uOw0KLQkJYW5ub3RhdGlvbkltcGwuc2V0SmF2YUVsZW1lbnQoamF2YUVsZW1lbnQpOw0KLQkJDQotCQlzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIHRydWUsIGphdmFFbGVtZW50KTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIGJvb2xlYW4gbmVlZFNhdmUsIGZpbmFsIFQgamF2YUVsZW1lbnQpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWlmICghbmVlZFNhdmUpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJYWRkVG9DbGFzcyhhbm5vdGF0aW9uSW1wbCwgKElUeXBlKWphdmFFbGVtZW50KTsJCQkJDQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkNCi0JCXsNCi0JCQlhZGRUb0ZpZWxkKGFubm90YXRpb25JbXBsLCAoSUZpZWxkKWphdmFFbGVtZW50KTsNCi0JCX0NCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkNCi0JCXsNCi0JCQlhZGRUb01ldGhvZChhbm5vdGF0aW9uSW1wbCwgKElNZXRob2QpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlhZGRUb1BhcmFtKGFubm90YXRpb25JbXBsLCAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIGFkZFRvQ2xhc3MoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElUeXBlIGNsYXNzVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIGNsYXNzVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgY2xhc3NUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9GaWVsZChBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUZpZWxkIGZpZWxkVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGZpZWxkVHlwZS5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQ0KLQkJYWRkVG9NZW1iZXIoYW5ub3RhdGlvbkltcGwsIGZpZWxkVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgZmllbGRUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9NZXRob2QoQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwsIElNZXRob2QgbWV0aG9kVHlwZSkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IG1ldGhvZFR5cGUuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWFkZFRvTWVtYmVyKGFubm90YXRpb25JbXBsLCBtZXRob2RUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBtZXRob2RUeXBlLCBjbGFzc05hbWUpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkVG9QYXJhbShBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJTWVtYmVyIG1lbWJlciA9IHR5cGVQYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOw0KLQkJaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QpDQotCQl7DQotCQkJY2xhc3NOYW1lID0gbWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJY2xhc3NOYW1lID0gbWVtYmVyLmdldEVsZW1lbnROYW1lKCk7DQotCQl9DQotDQotCQlhZGRUb01lbWJlcihhbm5vdGF0aW9uSW1wbCwgbWVtYmVyLmdldENvbXBpbGF0aW9uVW5pdCgpLCB0eXBlUGFyYW0sIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCBhZGRUb01lbWJlcihBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgSUphdmFFbGVtZW50IHR5cGUsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmIChjVW5pdCA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0NCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0JCQlBU1QgYXN0ID0gdW5pdC5nZXRBU1QoKTsNCi0NCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCQl7DQotCQkJCXN3aXRjaCAodHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJCQl7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkgdHlwZSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCWFkZEFubm90YXRpb24oYW5ub3RhdGlvbkltcGwsIGNVbml0LCB1bml0LCBhc3QsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIElKYXZhRWxlbWVudC5GSUVMRDoNCi0JCQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbigoSUZpZWxkKSB0eXBlLCB0eXBlRGVjbGFyYXRpb24pOw0KLQkJCQkJYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW1wbCwgY1VuaXQsIHVuaXQsIGFzdCwgZmllbGREZWNsYXJhdGlvbik7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gKElUeXBlUGFyYW1ldGVyKSB0eXBlOw0KLQkJCQkJaWYgKHR5cGVQYXJhbWV0ZXIuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKQ0KLQkJCQkJew0KLQkJCQkJCW1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkJCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtRGVjbGFyYXRpb24gPSBnZXRQYXJhbURlY2xhcmF0aW9uKHR5cGVQYXJhbWV0ZXIsIG1ldGhvZERlY2xhcmF0aW9uKTsNCi0JCQkJCQlhZGRBbm5vdGF0aW9uKGFubm90YXRpb25JbXBsLCBjVW5pdCwgdW5pdCwgYXN0LCBwYXJhbURlY2xhcmF0aW9uKTsNCi0JCQkJCX0NCi0JCQkJCWJyZWFrOw0KLQkJCQlkZWZhdWx0Og0KLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgdHlwZSBmb3IgYW5ub3RhdGlvbiIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5JbnZhbGlkVHJlZVN0YXRlTXNnLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgZSk7DQotCQl9DQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIEpheFdzVXRpbE1lc3NhZ2VzLkNvbXBVbml0TWlzc2luZ01zZywgZSk7DQotCQl9DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCwgSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QsIEFTVE5vZGUgZGVjbGFyYXRpb24pIA0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBjVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0NCi0JCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJRXhwcmVzc2lvbiBhbm5vdCA9IGFubm90YXRpb25JbXBsLmdldEV4cHJlc3Npb24odW5pdCwgYXN0KTsNCi0NCi0JCUxpc3QgbW9kaWZpZXJzID0gbnVsbDsNCi0NCi0JCXN3aXRjaCAoZGVjbGFyYXRpb24uZ2V0Tm9kZVR5cGUoKSkNCi0JCXsNCi0JCWNhc2UgQVNUTm9kZS5NRVRIT0RfREVDTEFSQVRJT046DQotCQljYXNlIEFTVE5vZGUuRklFTERfREVDTEFSQVRJT046DQotCQljYXNlIEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTjoNCi0JCQltb2RpZmllcnMgPSAoKEJvZHlEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLm1vZGlmaWVycygpOw0KLQkJCWJyZWFrOw0KLQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9WQVJJQUJMRV9ERUNMQVJBVElPTjoNCi0JCQltb2RpZmllcnMgPSAoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5tb2RpZmllcnMoKTsNCi0JCQlicmVhazsNCi0JCWRlZmF1bHQ6DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWRkQW5ub3RhdGlvbigpIGlsbGVnYWwgZGVjbGF0YWlvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCW1vZGlmaWVycy5hZGQoMCwgYW5ub3QpOw0KLQ0KLQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0NCi0JCVRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCUlTdGF0dXMgc3RhdHVzID0gZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBjVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0JCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0spDQotCQl7DQotCQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGNVbml0LCBkb2MuZ2V0KCksIHRydWUsIG51bGwpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJBbm5vdGF0dGlvbiBjb3VsZCBub3QgYmUgc3RvcmVkLCB0aGUgZmlsZSBpcyBub3Qgd3JpdGFibGUiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQlKYXhXc1V0aWxNZXNzYWdlcy5Bbm5vdGF0aW9uQ2Fubm90QmVTdG9yZWRNc2cpOyANCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGdldFBhcmFtRGVjbGFyYXRpb24oSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pDQotCXsNCi0JCS8vVE9ETyBjaGVjayB0aGlzIG1ldGhvZA0KLQkJZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IHR5cGVQYXJhbWV0ZXIuZ2V0RWxlbWVudE5hbWUoKTsNCi0NCi0JCWZvciAoT2JqZWN0IGRlY2wgOiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJaWYgKCEoZGVjbCBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pKQ0KLQkJCXsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQ0KLQkJCWlmIChwYXJhbU5hbWUuZXF1YWxzKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgZGVjbCkuZ2V0TmFtZSgpLnRvU3RyaW5nKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBkZWNsOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlcyB0aGUgUGFyYW1ldGVyLVZhbHVlIFBhaXJzIG9mIHNwZWNpZmljIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiAtIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgdXBkYXRlZC4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdHRpb25JbXBsID0gbmV3IEFubm90YXRpb25JbXBsPFQ+KGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSk7DQotCQl0cnkNCi0JCXsNCi0JCQl1cGRhdGVUaGVBbm5vdGF0aW9uKGFubm90YXRpb24uZ2V0QXBwbGllZEVsZW1lbnQoKSwgYW5ub3RhdHRpb25JbXBsKTsNCi0JCX0gDQotCQljYXRjaChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogVXBkYXRlcyB0aGUgUGFyYW0tVmFsdWUgUGFpcnMgb2Ygc3BlY2lmaWMgQW5ub3RhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIC0gQW5ub3RhdGlvbiwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkLg0KLQkgKiBAcGFyYW0gcGFyYW1WYWx1ZVBhaXJzIHdoaWNoIHdpbGwgYmUgdXBkYXRlZC4gT2xkIHBhaXJzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IG9uY2UuDQotCSAqIEBwYXJhbSByZXBsYWNlUHJldmlvdXNQYWlycyBib29sZWFuIHZhbHVlIHdoaWNoIHNwZWNpZmllcyB0aGUgd2F5LCBob3cgbmV3IElQYXJhbVZhbHVlUGFpcnMgd2lsbCBiZSB1cGRhdGVkLiBJZiB0aGUgdmFsdWUgaXMgPHR0PnRydWU8L3R0PiwNCi0JICogdGhlIFNldCB3aXRoIHRoZSBvbGQgSVBhcmFtVmFsdWVQYWlycyB3aWxsIGJlIGNsZWFyZWQgYW5kIHRoZSBuZXcgdmFsdWVzIHdpbGwgYmUgYXBwbGllZC4gSWYgdGhlIHZhbHVlIGlzIDx0dD5mYWxzZTwvdHQ+IHRoZSBvbGQgcGFpcnMgd2lsbCBiZSBrZXB0DQotCSAqIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgIHZhbHVlcyBmcm9tIHRoZSBuZXcgU2V0LCBpZiB0aGVyZSBhcmUgcGFyYW1zIHdoaWNoIGRvIG5vdCBleGlzdCBpbiB0aGUgb2xkIG9uZSwgdGhleSB3aWxsIGJlIGFkZGVkLg0KLQkgKiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICogDQotCSAqIEBkZXByZWNhdGVkIC0gdXNlIHB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgaW5zdGVhZC4NCi0JICovDQotCUBEZXByZWNhdGVkDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCB1cGRhdGUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiwgU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzLCBib29sZWFuIHJlcGxhY2VQcmV2aW91c1BhaXJzKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7CQ0KLQkJdXBkYXRlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCksIHBhcmFtVmFsdWVQYWlycywgcmVwbGFjZVByZXZpb3VzUGFpcnMpOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICogQHBhcmFtIDxUPg0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbg0KLQkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycw0KLQkgKiBAcGFyYW0gcmVwbGFjZVByZXZpb3VzUGFpcnMNCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgdXBkYXRlQW5ub3RhdGlvbihmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50LCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMsIGJvb2xlYW4gcmVwbGFjZVByZXZpb3VzUGFpcnMpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25JbXBsPFQ+IGFubm90YXRpb25JbXBsID0gKEFubm90YXRpb25JbXBsPFQ+KWFubm90YXRpb247DQotCQl0cnkNCi0JCXsNCi0JCQlpZihyZXBsYWNlUHJldmlvdXNQYWlycykNCi0JCQl7DQotCQkJCWFubm90YXRpb25JbXBsLnNldFBhcmFtVmFsdWVQYWlycyhwYXJhbVZhbHVlUGFpcnMpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYWlyIDogcGFyYW1WYWx1ZVBhaXJzKQ0KLQkJCQl7DQotCQkJCQlib29sZWFuIGlzVXBkYXRlZCA9IGZhbHNlOw0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gdG1wUGFyYW1WYWx1ZVBhaXJzID0gYW5ub3RhdGlvbkltcGwuZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQkJCQlmb3IgKElQYXJhbVZhbHVlUGFpciB0aGlzUGFpciA6IHRtcFBhcmFtVmFsdWVQYWlycykNCi0JCQkJCXsNCi0JCQkJCQlpZih0aGlzUGFpci5nZXRQYXJhbSgpLmVxdWFscyhwYWlyLmdldFBhcmFtKCkpKQ0KLQkJCQkJCXsNCi0JCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLnJlbW92ZSh0aGlzUGFpcik7DQotCQkJCQkJCXRtcFBhcmFtVmFsdWVQYWlycy5hZGQocGFpcik7DQotCQkJCQkJCWlzVXBkYXRlZCA9IHRydWU7DQotCQkJCQkJCWJyZWFrOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWlmKCFpc1VwZGF0ZWQpDQotCQkJCQl7DQotCQkJCQkJdG1wUGFyYW1WYWx1ZVBhaXJzLmFkZChwYWlyKTsNCi0JCQkJCX0NCi0JCQkJCWFubm90YXRpb25JbXBsLnNldFBhcmFtVmFsdWVQYWlycyh0bXBQYXJhbVZhbHVlUGFpcnMpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXVwZGF0ZVRoZUFubm90YXRpb24oamF2YUVsZW1lbnQsIGFubm90YXRpb25JbXBsKTsNCi0JCQkNCi0JCQkvL3JlbW92ZShhbm5vdGF0aW9uKTsNCi0JCQkvL3NldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGphdmFFbGVtZW50KTsNCi0JCX0gDQotCQljYXRjaChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuSW52YWxpZFRyZWVTdGF0ZU1zZywgZSk7DQotCQl9IA0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgSmF4V3NVdGlsTWVzc2FnZXMuQ2Fubm90UGVyZm9ybUVkaXRNc2csIGUpOw0KLQkJfSANCi0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGUpOw0KLQkJfQ0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbiAtIEFubm90YXRpb24sIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4NCi0JICogDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gdm9pZCByZW1vdmUoZmluYWwgSUFubm90YXRpb248VD4gYW5ub3RhdGlvbikgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJcmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uLCBhbm5vdGF0aW9uLmdldEFwcGxpZWRFbGVtZW50KCkpOw0KLQl9DQotDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihmaW5hbCBJQW5ub3RhdGlvbjxUPiBhbm5vdGF0aW9uLCBmaW5hbCBUIGphdmFFbGVtZW50KSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uSW1wbDxUPiBhbm5vdGF0aW9uSW1wbCA9IChBbm5vdGF0aW9uSW1wbDxUPilhbm5vdGF0aW9uOw0KLQkJdHJ5DQotCQl7DQotLy8JCQlpZihhbm5vdGF0aW9uSW1wbC5nZXRBbm5vdGF0aW9uU3RyaW5nVmFsdWUoKSA9PSBudWxsIHx8IGFubm90YXRpb25JbXBsLmdldEFubm90YXRpb25TdHJpbmdWYWx1ZSgpLnRyaW0oKS5lcXVhbHMoIiIpKQ0KLS8vCQkJew0KLS8vCQkJCWFubm90YXRpb25JbXBsLnNldEFubm90YXRpb25TdHJpbmdWYWx1ZShjcmVhdGVBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIGphdmFFbGVtZW50KSk7DQotLy8JCQkJQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkucmVtb3ZlQW5ub3RhdGlvbihqYXZhRWxlbWVudCwgYW5ub3RhdGlvbkltcGwuZ2V0QW5ub3RhdGlvblN0cmluZ1ZhbHVlKCkpOw0KLS8vCQkJfQ0KLS8vCQkJZWxzZQ0KLS8vCQkJew0KLQkJCQlBbm5vdGF0aW9uVXRpbHMuZ2V0SW5zdGFuY2UoKS5yZW1vdmVBbm5vdGF0aW9uKGphdmFFbGVtZW50LCBhbm5vdGF0aW9uSW1wbC5nZXRTaW1wbGVBbm5vdGF0aW9uTmFtZSgpKTsNCi0vLwkJCX0NCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJsZSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbihibGUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5DYW5ub3RQZXJmb3JtRWRpdE1zZywgYmxlKTsNCi0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKQ0KLQkJew0KLQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKGZuZmUuZ2V0TWVzc2FnZSgpLCBKYXhXc1V0aWxNZXNzYWdlcy5Db21wVW5pdE1pc3NpbmdNc2csIGZuZmUpOw0KLQkJfQkNCi0JfQ0KLQ0KLQkvLyBpMDM2NTA5IGFkZGVkDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiB2b2lkIHVwZGF0ZVRoZUFubm90YXRpb24oZmluYWwgVCBqYXZhRWxlbWVudCwgZmluYWwgQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbkltcGwpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCXsJCQ0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBpQ3UgPSBnZXRDdShqYXZhRWxlbWVudCk7DQotCQlmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGlDdSwgbnVsbCk7DQotCQkNCi0JCUJvZHlEZWNsYXJhdGlvbiBiZCA9IG51bGw7DQotCQlBbm5vdGF0aW9uIGZvdW5kID0gbnVsbDsNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihqYXZhRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQlmb3VuZCA9IGZpbmRBbm5vdGF0aW9uKGJkLCBhbm5vdGF0aW9uSW1wbCk7DQotDQotCQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQkJaWYgKGZvdW5kIT1udWxsKSB7DQotCQkJCWJkLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJfQ0KLQkJCQ0KLQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCWJkLm1vZGlmaWVycygpLmFkZCgwLCBhbm5vdCk7DQotCQl9DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElNZXRob2QpamF2YUVsZW1lbnQpLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQliZCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKChJTWV0aG9kKWphdmFFbGVtZW50KSwgdGQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0JCQ0KLQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQliZC5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCX0NCi0JCQkNCi0JCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQliZC5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpDQotCQl7DQotCQkJVHlwZURlY2xhcmF0aW9uIHRkID0gKFR5cGVEZWNsYXJhdGlvbilBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElGaWVsZClqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEVsZW1lbnROYW1lKCksIHVuaXQpOw0KLQkJCWJkID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKCgoSUZpZWxkKWphdmFFbGVtZW50KSwgdGQpOw0KLQkJCWZvdW5kID0gZmluZEFubm90YXRpb24oYmQsIGFubm90YXRpb25JbXBsKTsNCi0JCQ0KLQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCWlmIChmb3VuZCE9bnVsbCkgew0KLQkJCQliZC5tb2RpZmllcnMoKS5yZW1vdmUoZm91bmQpOw0KLQkJCX0NCi0JCQkNCi0JCQlmaW5hbCBFeHByZXNzaW9uIGFubm90ID0gYW5ub3RhdGlvbkltcGwuZ2V0RXhwcmVzc2lvbih1bml0LCB1bml0LmdldEFTVCgpKTsNCi0JCQliZC5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJfQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikNCi0JCXsNCi0JCQlpZigoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKSBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJCXsNCi0JCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbigoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXREZWNsYXJpbmdNZW1iZXIoKS5nZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSA9IGZpbmRQYXJhbWV0ZXIoYmQsIGphdmFFbGVtZW50KTsNCi0JCQkJaWYocGFyYW0gIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJZm91bmQgPSBmaW5kUGFyYW1Bbm5vdGF0aW9uKHBhcmFtLCBhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpOw0KLQkJCQl9DQotDQotCQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJCXBhcmFtLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJCX0NCi0JCQkJDQotCQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCQlwYXJhbS5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJCX0NCi0JCQllbHNlDQotCQkJew0KLQkJCQlUeXBlRGVjbGFyYXRpb24gdGQgPSAoVHlwZURlY2xhcmF0aW9uKUFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCgoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRQYXJlbnQoKSkuZ2V0RGVjbGFyaW5nVHlwZSgpLiBnZXRFbGVtZW50TmFtZSgpLCB1bml0KTsNCi0JCQkJYmQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKCgoSU1ldGhvZCkoKElUeXBlUGFyYW1ldGVyKWphdmFFbGVtZW50KS5nZXRQYXJlbnQoKSksIHRkKTsNCi0JCQkJU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSA9IGZpbmRQYXJhbWV0ZXIoYmQsIGphdmFFbGVtZW50KTsNCi0JCQkJaWYocGFyYW0gIT0gbnVsbCkNCi0JCQkJew0KLQkJCQkJZm91bmQgPSBmaW5kUGFyYW1Bbm5vdGF0aW9uKHBhcmFtLCBhbm5vdGF0aW9uSW1wbCwgamF2YUVsZW1lbnQpOw0KLQkJCQl9DQotDQotCQkJCXVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJCQlpZiAoZm91bmQhPW51bGwpIHsNCi0JCQkJCXBhcmFtLm1vZGlmaWVycygpLnJlbW92ZShmb3VuZCk7DQotCQkJCX0NCi0JCQkJDQotCQkJCWZpbmFsIEV4cHJlc3Npb24gYW5ub3QgPSBhbm5vdGF0aW9uSW1wbC5nZXRFeHByZXNzaW9uKHVuaXQsIHVuaXQuZ2V0QVNUKCkpOw0KLQkJCQlwYXJhbS5tb2RpZmllcnMoKS5hZGQoMCwgYW5ub3QpOw0KLQkJCX0NCi0JCX0NCi0JCQkJDQotCQlzZXRBbm5vdGF0YXRpb25TdHJpbmdWYWxsdWUoYW5ub3RhdGlvbkltcGwsIGZhbHNlLCBqYXZhRWxlbWVudCk7DQotCQlmaW5hbCBJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoaUN1KTsJDQotCQlmaW5hbCBUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgamF2YUVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsNCi0JCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCUlTdGF0dXMgc3RhdHVzID0gZWRpdFJlc01hbmFnZXIoKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBpQ3UuZ2V0UmVzb3VyY2UoKSk7DQotCQlpZihzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLk9LKQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhpQ3UsIGRvYy5nZXQoKSwgdHJ1ZSwgbnVsbCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oIkFubm90YXR0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJCQkJCUpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZyk7IA0KLQkJfQ0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGZpbmRBbm5vdGF0aW9uKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiB0ZCwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbikNCi0Jew0KLQkJQW5ub3RhdGlvbiBhbm47DQotCQlmb3IgKElFeHRlbmRlZE1vZGlmaWVyIG1vZGlmaWVyIDogKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+KXRkLm1vZGlmaWVycygpKSANCi0JCXsNCi0JCQlpZighbW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsNCi0JCQkJY29udGludWU7DQotCQkJfQ0KLQkJCQ0KLQkJCWFubiA9IChBbm5vdGF0aW9uKW1vZGlmaWVyOw0KLQkJCWlmIChhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZW5kc1dpdGgoYW5uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7DQotCQkJCXJldHVybiBhbm47DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBmaW5kUGFyYW1ldGVyKGZpbmFsIEJvZHlEZWNsYXJhdGlvbiB0ZCwgVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJaWYgKHRkICE9IG51bGwpDQotCQl7DQotCQkJZm9yIChPYmplY3QgcGFyYW0gOiAoKE1ldGhvZERlY2xhcmF0aW9uKXRkKS5wYXJhbWV0ZXJzKCkpDQotCQkJew0KLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uICYmDQotCQkJCQkJKChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKS50b1N0cmluZygpLmVxdWFscygoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW0pLmdldE5hbWUoKS50b1N0cmluZygpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIDxUIGV4dGVuZHMgSUphdmFFbGVtZW50PiBBbm5vdGF0aW9uIGZpbmRQYXJhbUFubm90YXRpb24oZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBwYXJhbSwgZmluYWwgSUFubm90YXRpb248PyBleHRlbmRzIElKYXZhRWxlbWVudD4gYW5ub3RhdGlvbiwgVCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJQW5ub3RhdGlvbiBhbm47DQotCQlmb3IgKElFeHRlbmRlZE1vZGlmaWVyIG1vZGlmaWVyIDogKExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+KShwYXJhbS5tb2RpZmllcnMoKSkpIA0KLQkJew0KLQkJCWlmKCFtb2RpZmllci5pc0Fubm90YXRpb24oKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJYW5uID0gKEFubm90YXRpb24pbW9kaWZpZXI7DQotCQkJaWYgKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lbmRzV2l0aChhbm4uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsNCi0JCQkJcmV0dXJuIGFubjsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGdldEN1KGZpbmFsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkNCi0Jew0KLQkJc3dpdGNoIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSANCi0JCXsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEU6DQotCQkJcmV0dXJuICgoSVR5cGUpIGphdmFFbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCXJldHVybiAoKElGaWVsZCkgamF2YUVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCXJldHVybiAoKElNZXRob2QpIGphdmFFbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWNhc2UgSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSOg0KLQkJCXJldHVybiAoKElUeXBlUGFyYW1ldGVyKSBqYXZhRWxlbWVudCkuZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIEVkaXRSZXNvdXJjZXNNYW5hZ2VyIGVkaXRSZXNNYW5hZ2VyKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBFZGl0UmVzb3VyY2VzTWFuYWdlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGQ4ZDgzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgQ29tcGxleCBBbm5vdGF0aW9uIGNvbnNpc3Rpbmcgb2YgcGFyYW0tdmFsdWUgcGFpcnMuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbjxUIGV4dGVuZHMgSUphdmFFbGVtZW50Pg0KLXsNCi0JLyoqDQotCSAqIFJldHVybiB0aGUgcGFyYW0tdmFsdWUgcGFpcnMgd2hpY2ggdGhpcyBBbm5vdGF0aW9uIGhhcy4NCi0JICogDQotCSAqIEByZXR1cm4gU2V0IG9mIHBhcmFtLXZhbHVlcyBwYWlycy4NCi0JICovDQotCXB1YmxpYyBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBnZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpdGggbmFtZSBwYXJhbS4gDQotCSAqIEBwYXJhbSBwYXJhbSAtIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgd2hvJ3MgdmFsdWUgaXMgcmVxdWVzdGVkDQotCSAqIEByZXR1cm4gLSB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuIE51bGwgaWYgc3VjaCBwYXJhbWV0ZXIgY2Fubm90IGJlIGZvdW5kIG9yIGhhcyBhIHZhbHVlIG9mIG51bGwuDQotCSAqIEB0aHJvd3MgLSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwYXJhbSBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHBhcmFtKTsNCi0JCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgVCwgdG8gd2hpY2ggdGhpcyBhbm5vdGF0dGlvbiBpcyBhc3NvY2lhdGVkLg0KLQkgKi8NCi0gICAgcHVibGljIFQgZ2V0QXBwbGllZEVsZW1lbnQoKTsNCi0gICAgICAgIA0KLSAgICANCi0vL0Zyb20gSUFubm90YXR0aW9uQmFzZSAgICANCi0JLyoqDQotCSAqIEByZXR1cm4gLSBhbm5vdGF0aW9uIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsNCi0JDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIElMb2NhdG9yDQotCSAqLw0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpOw0KLQkNCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25CYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJmOTAwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEJhc2UgaW50ZXJmYWNlIHJlcHJlc2VudGluZyBBbm5vdGF0aW9uIGFuZCB0aGUgZnVuY3Rpb25hbGl0eSwgcmVxdWlyZWQgYnkgaXQuDQotICoNCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElBbm5vdGF0aW9uQmFzZTxUIGV4dGVuZHMgSUphdmFFbGVtZW50Pg0KLXsNCi0JLyoqIHNpbXBsZSBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBTSU1QTEVfQU5OT1RBVElPTiA9IDE7DQotDQotCS8qKiBzaW5nbGUgZWxlbWVudCBhbm5vdGF0aW9uIHR5cGUgSUQgKi8NCi0JcHVibGljIGZpbmFsIGludCBTSU5HTEVfRUxFTUVOVF9BTk5PVEFUSU9OID0gMjsNCi0NCi0JLyoqIGNvbXBsZXggYW5ub3RhdGlvbiB0eXBlIElEICovDQotCXB1YmxpYyBmaW5hbCBpbnQgQ09NUExFWF9BTk5PVEFUSU9OID0gNDsNCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gLSBhbm5vdGF0aW9uIG5hbWUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsNCi0NCi0JLyoqDQotCSAqIEdldHRpbmcgdGhlIFR5cGVJRCBvZiBjdXJyZW50IEFubm90YXRpb24NCi0JICogDQotCSAqIEByZXR1cm4gSW50ZWdlciB2YWx1ZSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgQW5ub3RhdGlvbiBUeXBlSUQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOw0KLQkNCi0JLyoqDQotCSAqIEFkZHMgY3VycmVudCBBbm5vdGF0aW9uIHRvIHNwZWNpZmljIElKYXZhRWxlbWVudC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhdmUgSU1lbWJlciBhcyBwYXJhbWV0ZXIgYmVjYXVzZSB0aGVyZSBpcyBJVHlwZVBhcmFtZXRlciBhcyBwYXJhbWV0ZXIgd2hlbiBhZGQgdG8gVHlwUGFyYW1ldGVyIGlzIGV4ZWN1dGVkLg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50DQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5qYXZhRWxlbWVudDwvdHQ+IGlzIG51bGwuDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJVHlwZSwgSU1ldGhvZCwgSUZpZWxkLCBJVHlwZVBhcmFtZXRlci4NCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXBwbGllZEVsZW1lbnQoVCBqYXZhRWxlbWVudCkgdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlIHRoZSBjdXJyZW50IEFubm90YXRpb24gZnJvbSB0aGUgYXNzb2NpYXRlZCBKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICogQHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb247DQotCQ0KLQkvKioNCi0JICogR2V0cyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBjb2RlLg0KLQkgKiANCi0JICogQHJldHVybiBJTG9jYXRvcg0KLQkgKi8NCi0JcHVibGljIElMb2NhdG9yIGdldExvY2F0b3IoKTsNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvbkluc3BlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjM2YwNWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25JbnNwZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvbkluc3BlY3Rvcg0KLXsNCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgVHlwZSBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPnR5cGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBJQW5ub3RhdGlvbkluc3BlY3Rvci4NCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIFR5cGUgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+dHlwZTwvY29kZT4gb3IgZW1wdHkgQ29sbGVjdGlvbiBpZiBub3QgcHJlc2VudC4NCi0JICoNCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBpbnNwZWN0VHlwZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBUeXBlIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPnR5cGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBJQW5ub3RhdGlvbkluc3BlY3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBUeXBlIGxldmVsIEFubm90YXRpb24gaW4gPGNvZGU+dHlwZTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4sIGlmIHN1Y2ggQW5ub3RhdGlvbiBkbyBub3QgcHJlc2VudC4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLQlJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdFR5cGUoZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhbGwgTWV0aG9kIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+bWV0aG9kPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBtZXRob2QNCi0JICogDQotCSAqIEByZXR1cm4gY29udGFpbmVkIE1ldGhvZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5tZXRob2Q8L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDx0dD5tZXRob2Q8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKi8NCi0gICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBpbnNwZWN0TWV0aG9kKElNZXRob2QgbWV0aG9kKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIGEgTWV0aG9kIGxldmVsIEFubm90YXRpb24gd2l0aCBzcGVjaWZpYyBRTmFtZSBmcm9tIDxjb2RlPm1ldGhvZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWV0aG9kDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgTWV0aG9kIGxldmVsIEFubm90YXRpb24gaW4gPGNvZGU+bWV0aG9kPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgPHR0Pm1ldGhvZDwvdHQ+IG9yIDxjb2RlPmFubm90YXRpb25RTmFtZTwvY29kZT4gYXJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGlzIGVtcHR5IFN0cmluZy4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0TWV0aG9kKElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGFsbCBGaWVsZCBsZXZlbCBBbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmZpZWxkPC9jb2RlPi4NCi0JICogDQotCSAqIEBwYXJhbSBmaWVsZA0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgRmlsZWQgbGV2ZWwgQW5ub3RhdGlvbnMgaW4gPGNvZGU+ZmllbGQ8L2NvZGU+IG9yIGVtcHR5IENvbGxlY3Rpb24gaWYgbm90IHByZXNlbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmZpZWxkPC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JICovDQotICBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElGaWVsZD4+IGluc3BlY3RGaWVsZChJRmllbGQgZmllbGQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotICAgDQotICAgIC8qKg0KLQkgKiBSZXRyaWV2ZXMgYSBGaWVsZCBsZXZlbCBBbm5vdGF0aW9uIHdpdGggc3BlY2lmaWMgUU5hbWUgZnJvbSA8Y29kZT5maWVsZDwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmllbGQNCi0JICogQHBhcmFtIGFubm90YXRpb25RTmFtZSAtIHNwZWNpZmllZCBRTmFtZSBmb3IgdGhlIEFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBGaWxlZCBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5maWVsZDwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmZpZWxkPC9jb2RlPiBvciA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgSUFubm90YXRpb248SUZpZWxkPiBpbnNwZWN0RmllbGQoSUZpZWxkIGZpZWxkLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLQ0KLSAgICAvKioNCi0JICogUmV0cmlldmVzIGFsbCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGZyb20gPGNvZGU+cGFyYW08L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvbnRhaW5lZCBUeXBlUGFyYW1ldGVyIGxldmVsIEFubm90YXRpb25zIGluIDxjb2RlPnBhcmFtPC9jb2RlPiBvciBlbXB0eSBDb2xsZWN0aW9uIGlmIG5vdCBwcmVzZW50Lg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wYXJhbTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGluc3BlY3RQYXJhbShJVHlwZVBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICAgLyoqDQotCSAqIFJldHJpZXZlcyBhIFR5cGVQYXJhbWV0ZXIgbGV2ZWwgQW5ub3RhdGlvbiB3aXRoIHNwZWNpZmljIFFOYW1lIGZyb20gPGNvZGU+cGFyYW08L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIHBhcmFtDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uUU5hbWUgLSBzcGVjaWZpZWQgUU5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiANCi0JICogQHJldHVybiBjb250YWluZWQgVHlwZVBhcmFtZXRlciBsZXZlbCBBbm5vdGF0aW9ucyBpbiA8Y29kZT5wYXJhbTwvY29kZT4gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPnBhcmFtPC9jb2RlPiBvciA8Y29kZT5hbm5vdGF0aW9uUU5hbWU8L2NvZGU+IGFyZSA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+YW5ub3RhdGlvblFOYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqLw0KLSAgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RQYXJhbShJVHlwZVBhcmFtZXRlciBwYXJhbSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCi0gICANCi0gICANCi0gICANCi0JDQotLy8JLyoqDQotLy8JICogUmV0cmlldmVzIGFsbCBhbm5vdGF0aW9ucyBmcm9tIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPi4NCi0vLwkgKiANCi0vLwkgKiBAcGFyYW0gamF2YUVsZW1lbnQNCi0vLwkgKiANCi0vLwkgKiBAcmV0dXJuIGNvbnRhaW5lZCBhbm5vdGF0aW9ucyBpbiA8Y29kZT5qYXZhRWxlbWVudDwvY29kZT4gb3IgZW1wdHkgQ29sbGVhY3Rpb24gaWYgbm90IHByZXNlbnQuDQotLy8JICogDQotLy8JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLS8vCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgPGNvZGU+amF2YUVsZW1lbnQ8L2NvZGU+IGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBTdXBwb3J0ZWQgdHlwZXMgYXJlOiBJdHlwZSwgSU1ldGhvZCwgSUZpZWxkLg0KLS8vCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotLy8JICovDQotLy8JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb24+IGluc3BlY3QoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lBbm5vdGF0aW9uUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYjkwYmNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkF0dHJpYnV0ZVR5cGVFbnVtOw0KLQ0KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25Qcm9wZXJ0eQ0KLXsNCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOw0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsNCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsNCi0JDQotCXB1YmxpYyBBdHRyaWJ1dGVUeXBlRW51bSBnZXRBdHRyaWJ1dGVUeXBlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNjYzc2OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9hbm5vdGF0aW9ucy9JQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblByb3BlcnR5Ow0KLQ0KLS8qKg0KLSAqIEludGVyZmFjZSBmb3IgYW5ub3RhdGlvbnMgY29udGFpbmVyLg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyDQotew0KLQlwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uUHJvcGVydHkoZmluYWwgQW5ub3RhdGlvblByb3BlcnR5IGFubm90YXRpb25Qcm9wZXJ0eSwgZmluYWwgRWxlbWVudFR5cGUgdGFyZ2V0KTsNCi0JDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhJVHlwZVBhcmFtZXRlciB0UGFyYW0pOw0KLQ0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElUeXBlPj4gZ2V0VHlwZUFubm90YXRpb25zKElUeXBlIHR5cGUpOw0KLQ0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElNZXRob2Q+PiBnZXRNZXRob2RBbm5vdGF0aW9ucyhJTWV0aG9kIG1ldGhvZCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzQ3NjM2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBDbGFzcyB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIHRvIGxvY2F0ZSBzcGVjaWZpYyByZWdpb24gaW4gdGhlIHNvdXJjZSBjb2RlIA0KLSAqDQotICovDQotcHVibGljIGludGVyZmFjZSBJTG9jYXRvcg0KLXsNCi0JLyoqDQotCSAqIEByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluIHRoZSBzb3VyY2Ugd2hlcmUgdGhlIHJlZ2lvbiBwb2ludGVkIGJ5IHRoaXMgbG9jYXRvciBzdGFydHMgIA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCk7DQotCQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHJlZ2lvbiBpbiBzb3VyY2UgY29kZQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCk7DQotCQ0KLQkvKioNCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24NCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lQYXJhbVZhbHVlUGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmZmU2ZTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVBhcmFtVmFsdWVQYWlyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHBhcmFtIHZhbHVlIHBhaXIgaW4gYW5ub3RhdGlvbi4gUGFyYW0gdmFsdWUgcGFpciBoYXMgdGhlIGZvbGxvd2luZyBmb3JtOiBwYXJhbT12YWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcmFtVmFsdWVQYWlyDQotew0KLQkvKioNCi0JICogQHJldHVybiBwYXJhbSBuYW1lDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtKCk7DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIElWYWx1ZSBnZXRWYWx1ZSgpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2Fubm90YXRpb25zL0lWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMmM0YTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvYW5ub3RhdGlvbnMvSVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9uczsNCi0NCi0vKioNCi0gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGFydGlmYWN0IHZhbHVlIGluIGFubm90YXRpb24uDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGludGVyZmFjZSBJVmFsdWUNCi17DQotCS8qKg0KLQkgKiBPYnRhaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS4gVGhlIG9idGFpbmVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBjYW4gbGF0ZXIgb24gYmUgdXNlZCB0byBpbnN0YW50aWF0ZQ0KLQkgKiBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGNvbnNpZGVkZXJlZCBlcXVhbCB0byB0aGUgcmV0dXJuZWQgdmFsdWUuDQotCSAqIDxwPg0KLQkgKiAJPGM+QEFubm90YXRpb25FeGFtcGxlKDEpPC9jPiAvL2Fubm9hdGlvbiB3aXRoIG9uZSBhdHRyaWJ1dGUvcGFyYW1ldGVyIGNhbGxlZCAidmFsdWUiIHdpdGggdmFsdWUgb2YgIjEiLiANCi0JICogPC9wPg0KLQkgKiBUaGUgdG9TdHJpbmcgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzdHJpbmcgIjEiLCB3aGljaCBjYW4gbGF0ZXIgb24gYmUgdXNlZCBieSBJbnRlZ2VyLnBhcnNlKFN0cmluZykgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIEludGVnZXINCi0JICogZXF1YWwgdG8gdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBpbnRlZ2VyIGxpdGVyYWwgMQ0KLQkgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpOw0KLQkNCi0JLyoqDQotCSAqIEdldHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4NCi0JICogDQotCSAqIEByZXR1cm4gSUxvY2F0b3INCi0JICovDQotCXB1YmxpYyBJTG9jYXRvciBnZXRMb2NhdG9yKCk7DQotCQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2NsYXp6L0FTVFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExOTk3ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9jbGF6ei9BU1RVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6Ow0KLQ0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbTsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyBmb3Ige0BsaW5rIEFTVH0gcHJvY2Vzc2luZy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFTVFV0aWxzIA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgQVNUVXRpbHMgaW5zdGFuY2U7DQotCQ0KLQlwcml2YXRlIEFTVFV0aWxzKCkgew0KLQkJLy8gZGlzYWJsZSBjb25zdHJ1Y3Rpb24NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gY3JlYXRlIG5ldyBpbnN0YW5jZSBmb3IgdGhpcyB1dGlsaXR5DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEFTVFV0aWxzIGdldEluc3RhbmNlKCkgew0KLQkJaWYoaW5zdGFuY2U9PW51bGwpIHsNCi0JCQlpbnN0YW5jZSA9IG5ldyBBU1RVdGlscygpOyANCi0JCX0NCi0JCXJldHVybiBpbnN0YW5jZTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgQVNUIHRyZWUgb3V0IG9mIHtAbGluayBGaWxlfSBpbnN0YW5jZS4NCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgamF2YSBjbGFzcyBmaWxlICANCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcmV0dXJuIGNyZWF0ZWQge0BsaW5rIEFTVE5vZGV9DQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBBU1ROb2RlIGNyZWF0ZUFTVChmaW5hbCBGaWxlIHNvdXJjZUZpbGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIA0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzb3VyY2VGaWxlLCAic291cmNlRmlsZSIpOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWZpbmFsIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsNCi0JCXBhcnNlci5zZXRTb3VyY2UoRmlsZVV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmlsZUNvbnRlbnQoc291cmNlRmlsZSkudG9DaGFyQXJyYXkoKSk7DQotCQlyZXR1cm4gcGFyc2VyLmNyZWF0ZUFTVChtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyB7QGxpbmsgQVNUfSB0cmVlIG91dCBvZiB7QGxpbmsgSVR5cGV9IGluc3RhbmNlLg0KLQkgKiBAcGFyYW0gc291cmNlVHlwZSBqYXZhIGNsYXNzDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiBjcmVhdGVkIHtAbGluayBBU1ROb2RlfSBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIENvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2VDdSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShzb3VyY2VDdSwgInNvdXJjZUN1Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWZpbmFsIEFTVFBhcnNlciBwYXJzZXIgPSBBU1RQYXJzZXIubmV3UGFyc2VyKEFTVC5KTFMzKTsNCi0JCXBhcnNlci5zZXRTb3VyY2Uoc291cmNlQ3UpOw0KLQkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkoZmFsc2UpOw0KLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpcGFyc2VyLmNyZWF0ZUFTVChtb25pdG9yKTsNCi0JfQkJDQotCQ0KLQkvKioNCi0JICogRmluZHMge0BsaW5rIEZpZWxkRGVjbGFyYXRpb259IGluIHtAbGluayBUeXBlRGVjbGFyYXRpb259IHdpdGggbmFtZSA8Y29kZT5maWVsZFR5cGUuZ2V0RWxlbWVudE5hbWUoKTwvY29kZT4uDQotCSAqIA0KLQkgKiBAcGFyYW0gZmllbGRUeXBlDQotCSAqIEBwYXJhbSB0eXBlRGVjbGFyYXRpb24NCi0JICogQHJldHVybiBmb3VuZCBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICovDQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIGdldEZpZWxkRGVjbGFyYXRpb24oZmluYWwgSUZpZWxkIGZpZWxkVHlwZSwgZmluYWwgVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikNCi0Jew0KLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZkIDogdHlwZURlY2xhcmF0aW9uLmdldEZpZWxkcygpKQ0KLQkJew0KLQkJCWZvciAoT2JqZWN0IGZyIDogZmQuZnJhZ21lbnRzKCkpDQotCQkJew0KLQkJCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmRmID0gKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgZnI7DQotCQkJCWlmICh2ZGYuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhmaWVsZFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBmZDsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmVNZXRob2RQYXJhbXMoZmluYWwgSU1ldGhvZCBtZXRob2RUeXBlLCBmaW5hbCBNZXRob2REZWNsYXJhdGlvbiBtZCkNCi0Jew0KLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBsaXN0ID0gbWQucGFyYW1ldGVycygpOw0KLQkJaWYgKGxpc3Quc2l6ZSgpID09IG1ldGhvZFR5cGUuZ2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCkpDQotCQl7DQotCQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZXMgPSBtZXRob2RUeXBlLmdldFBhcmFtZXRlclR5cGVzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKQ0KLQkJCXsNCi0JCQkJaWYgKCFpc1NhbWVQYXJhbShwYXJhbWV0ZXJUeXBlc1tpXSwgKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIGxpc3QuZ2V0KGkpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNTYW1lUGFyYW0oZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc3ZEZWNsKQ0KLQl7DQotCQlyZXR1cm4gdHlwZS5lcXVhbHMoZ2V0VHlwZVNpZ25hdHVyZShzdkRlY2wpKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlcyB0eXBlIHNpZ25hdHVyZSBmcm9tIHtAbGluayBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9ufS4gQXMge0BsaW5rIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb259IHJldHVybnMgb25seSB0aGUgY2xlYW4gdHlwZSBpbiBjYXNlDQotCSAqIGRlY2xhcmF0aW9uIG9mIHR5cGUgPHR0PmludCBwYXJhQXJyW11bXTwvdHQ+IGlzIGluIGNvZGUgdGhlIG1ldGhvZCBhZGRzIGFycmF5IGlkZW50aWZpZXJzIGZvciB0eXBlIGRlY2xhcmF0aW9uIGludCB0aGlzIGNhc2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gc3ZEZWNsDQotCSAqIEByZXR1cm4gdGhlIHNpZ25hdHlyZSBmb3IgdGhlIHR5cGUNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZShmaW5hbCBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHN2RGVjbCkNCi0Jew0KLQkJU3RyaW5nIHR5cGVOYW1lID0gY3JlYXRlRGltZW5zaW9uZWRUeXBlTmFtZShTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShzdkRlY2wuZ2V0VHlwZSgpLnRvU3RyaW5nKCksIGZhbHNlKSwgc3ZEZWNsLmdldEV4dHJhRGltZW5zaW9ucygpKTsNCi0NCi0JCS8vIFZhcmFyZ3MgYXBwZW5kIGFub3RoZXIgZGltZW5zaW9uDQotCQlpZiAoc3ZEZWNsLmlzVmFyYXJncygpKQ0KLQkJew0KLQkJCXR5cGVOYW1lID0gU2lnbmF0dXJlLkNfQVJSQVkgKyB0eXBlTmFtZTsNCi0JCX0NCi0NCi0JCXJldHVybiB0eXBlTmFtZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRGltZW5zaW9uZWRUeXBlTmFtZShmaW5hbCBTdHJpbmcgdHlwZU5hbWUsIGZpbmFsIGludCBkaW1lbnNpb25zKQ0KLQl7DQotCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKHR5cGVOYW1lKTsNCi0JCWZpbmFsIFN0cmluZyBkaW1lbnNpb25TdHJpbmcgPSBjcmVhdGVEaW1lbnNpb25TdHJpbmcoZGltZW5zaW9ucyk7DQotCQl3aGlsZSghcmVzdWx0LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChkaW1lbnNpb25TdHJpbmcpKQ0KLQkJew0KLQkJCXJlc3VsdC5pbnNlcnQoMCwgU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JDQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZURpbWVuc2lvblN0cmluZyhmaW5hbCBpbnQgZGltZW5zaW9ucykNCi0Jew0KLQkJZmluYWwgY2hhcltdIGRpbWVuc2lvbkNoYXJzID0gbmV3IGNoYXJbZGltZW5zaW9uc107DQotCQlBcnJheXMuZmlsbChkaW1lbnNpb25DaGFycywgU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGltZW5zaW9uQ2hhcnMpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogRmluZHMge0BsaW5rIE1ldGhvZERlY2xhcmF0aW9ufSBpbiB7QGxpbmsgVHlwZURlY2xhcmF0aW9ufSBoYXZpbmcgbmFtZSA8Y29kZT5tZXRob2RUeXBlLmdldEVsZW1lbnROYW1lKCk8L2NvZGU+Lg0KLQkgKiANCi0JICogQHBhcmFtIG1ldGhvZFR5cGUNCi0JICogQHBhcmFtIHR5cGVEZWNsYXJhdGlvbg0KLQkgKiBAcmV0dXJuIGZvdW5kIG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKi8NCi0JcHVibGljICBNZXRob2REZWNsYXJhdGlvbiBnZXRNZXRob2REZWNsYXJhdGlvbihmaW5hbCBJTWV0aG9kIG1ldGhvZFR5cGUsIGZpbmFsIFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pDQotCXsNCi0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWQgOiB0eXBlRGVjbGFyYXRpb24uZ2V0TWV0aG9kcygpKQ0KLQkJew0KLQkJCWlmIChtZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG1ldGhvZFR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpDQotCQkJew0KLQkJCQlpZiAoY29tcGFyZU1ldGhvZFBhcmFtcyhtZXRob2RUeXBlLCBtZCkpDQotCQkJCXsNCi0JCQkJCXJldHVybiBtZDsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHtAbGluayBUeXBlRGVjbGFyYXRpb259IGZyb20ge0BsaW5rIENvbXBpbGF0aW9uVW5pdH0gd2l0aCBuYW1lIDx0dD5jbGFzc05hbWU8L3R0Pg0KLQkgKiANCi0JICogQHBhcmFtIGNsYXNzTmFtZQ0KLQkgKiBAcGFyYW0gdW5pdA0KLQkgKiBAcmV0dXJuIGZvdW5kIHtAbGluayBUeXBlRGVjbGFyYXRpb259IG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBDb21waWxhdGlvblVuaXQgdW5pdCkNCi0Jew0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uID0gbnVsbDsNCi0JCS8vIGxvb2tpbmcgdXAgdGhlIHNlbGVjdGVkIHR5cGUNCi0JCWZvciAoT2JqZWN0IHR5cGVPYmplY3QgOiB1bml0LnR5cGVzKCkpDQotCQl7DQotCQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdG1wVHlwZURlY2xhcmF0aW9uID0gKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSB0eXBlT2JqZWN0Ow0KLQkJCWlmICh0bXBUeXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpKQ0KLQkJCXsNCi0JCQkJdHlwZURlY2xhcmF0aW9uID0gdG1wVHlwZURlY2xhcmF0aW9uOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCXsNCi0JCQlMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiBsaXN0ID0gdW5pdC50eXBlcygpOw0KLQkJCXR5cGVEZWNsYXJhdGlvbiA9IGdldElubmVyQ2xhc3MobGlzdC50b0FycmF5KG5ldyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbltsaXN0LnNpemUoKV0pLCBjbGFzc05hbWUpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uOw0KLQl9DQotCQ0KLQlwcml2YXRlIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldElubmVyQ2xhc3MoZmluYWwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlcywgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkNCi0Jew0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsNCi0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlIDogdHlwZXMpDQotCQl7DQotCQkJaWYgKGFic3RyYWN0VHlwZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsNCi0JCQkJcmV0dXJuIGFic3RyYWN0VHlwZTsNCi0JCQl9DQotDQotCQkJaWYgKCEoYWJzdHJhY3RUeXBlIGluc3RhbmNlb2YgVHlwZURlY2xhcmF0aW9uKSkgew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJDQotCQkJcmVzdWx0ID0gZ2V0SW5uZXJDbGFzcygoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSkgKChUeXBlRGVjbGFyYXRpb24pIGFic3RyYWN0VHlwZSkuZ2V0VHlwZXMoKSwgY2xhc3NOYW1lKTsNCi0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gbnVsbDsNCi0JfQkNCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9kb20vdmFsaWRhdGlvbi9Eb21WYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmVhN2I2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2RvbS92YWxpZGF0aW9uL0RvbVZhbGlkYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmRvbS52YWxpZGF0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBEb21WYWxpZGF0aW9uQ29uc3RhbnRzIA0KLXsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24uV3NWYWxpZGF0b3JNYXJrZXIiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTiA9ICJpbXBsZW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTX0NPTlNUUkFJTlRfSUQgPSAid2ViU2VydmljZUNvbnN0cmFpbnQiOyAvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQX0NPTlNUUkFJTlRfSUQgPSAid2ViUGFyYW1Db25zdHJhaW50IjsgLy8kTk9OLU5MUy0xJA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTV9DT05TVFJBSU5UX0lEID0gIndlYk1ldGhvZENvbnN0cmFpbnQiOyAvLyROT04tTkxTLTEkDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFSV9DT05TVFJBSU5UX0lEID0gInNlaUNvbnN0cmFpbnQiOyAvLyROT04tTkxTLTEkDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL0xvY2FsaXplZEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTG9jYWxpemVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjZTA4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTG9jYWxpemVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotDQotDQotDQotLyoqDQotICogVGhpcyBpcyBiYXNlIGNsYXNzIGZvciBhbGwgQ0hFQ0tFRCBleGNlcHRpb25zIGZvciB0aGUgV1MgVG9vbHMNCi0gKiB0b29sc2V0LiBUaGlzIGV4Y2VwdGlvbiBjb3JyZWN0bHkgb3ZlcnJpZGVzIGdldExvY2FsaXplZE1lc3NhZ2UoKQ0KLSAqIG9mIEV4Y2VwdGlvbiBjbGFzcyBhbmQgcHJvdmlkZSBwcm9wZXIgbG9jYWxpemVkIG1lc3NhZ2UuDQotICogVG8gYWNoaWV2ZSB0aGF0IHRoZXJlIGlzIGEgbGltaXRhdGlvbiAtIGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byByZXR1cm4gbG9jYWxpemVkDQotICogbWVzc2FnZSBpZiBpdCBoYXZlbid0IGJlZW4gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBleGNlcHRpb24sIHNvIHRoZXJlIGlzIG5vDQotICogY29uc3RydWN0b3Igd2l0aG91dCBsb2NhbGl6ZWQgbWVzc2FnZS4NCi0gKiANCi0gKiBAYXV0aG9yIE1sYWRlbiBUb21vdg0KLSAqKi8NCi0NCi1wdWJsaWMgY2xhc3MgTG9jYWxpemVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotCQ0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlOw0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgZXhjZXB0aW9uIHdpdGggYWJpbGl0eSB0byBwcm92aWRlIGxvY2FsaXplZCBtZXNzYWdlDQotCSAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIGRldGFpbCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRNZXNzYWdlIC0gdGhlIGxvY2FsaXplZCBtZXNzYWdlICh3aGljaCBpcyBzYXZlZCBmb3IgbGF0ZXIgcmV0cmlldmFsDQotICAgICAqICAgICAgICAgYnkgdGhlIHtAbGluayAjZ2V0TG9jYWxpemVkTWVzc2FnZSgpfSBtZXRob2QpDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAtIGluIGNhc2UgbG9jYWxpemVkIG1lc3NhZ2UgaXMgbnVsbA0KLQkgKiAqLw0KLQlwdWJsaWMgTG9jYWxpemVkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSkgew0KLQkJc3VwZXIobWVzc2FnZSk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obG9jYWxpemVkTWVzc2FnZSwgImxvY2FsaXplZE1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5sb2NhbGl6ZWRNZXNzYWdlID0gbG9jYWxpemVkTWVzc2FnZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBleGNlcHRpb24gd2l0aCBhYmlsaXR5IHRvIHByb3ZpZGUgbG9jYWxpemVkIG1lc3NhZ2UNCi0JICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgZGV0YWlsIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UgLSB0aGUgbG9jYWxpemVkIG1lc3NhZ2UgKHdoaWNoIGlzIHNhdmVkIGZvciBsYXRlciByZXRyaWV2YWwNCi0gICAgICogICAgICAgICBieSB0aGUge0BsaW5rICNnZXRMb2NhbGl6ZWRNZXNzYWdlKCl9IG1ldGhvZCkNCi0JICogQHBhcmFtIGNhdXNlIC0gIGNhdXNlIHRoZSBjYXVzZSAod2hpY2ggaXMgc2F2ZWQgZm9yIGxhdGVyIHJldHJpZXZhbCBieSB0aGUNCi0gICAgICogICAgICAgICB7QGxpbmsgI2dldENhdXNlKCl9IG1ldGhvZCkuDQotCSAqIA0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAtIGluIGNhc2UgbG9jYWxpemVkIG1lc3NhZ2UgaXMgbnVsbA0KLQkgKiAqLw0KLQkNCi0JcHVibGljIExvY2FsaXplZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgew0KLQkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGxvY2FsaXplZE1lc3NhZ2UsICJsb2NhbGl6ZWRNZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMubG9jYWxpemVkTWVzc2FnZSA9IGxvY2FsaXplZE1lc3NhZ2U7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGxvY2FsaXplZCBtZXNzYWdlIHdpdGggd2hpY2ggdGhlIGV4Y2VwdGlvbiB3YXMgY29uc3RydWN0ZWQuKi8NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHsNCi0JCXJldHVybiBsb2NhbGl6ZWRNZXNzYWdlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZXhjZXB0aW9uL01pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhMjEyOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9leGNlcHRpb24vTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb247DQotDQotDQotLyoqDQotICogSW5kaWNhdGVzIHRoYXQgYSByZXNvdXJjZSBvZiBhbnkga2luZCBjb3VsZG4ndCBiZSBmb3VuZCBidXQgdGhpcyB3YXMgZXhwZWN0ZWQuDQotICogDQotICogQGF1dGhvciBKb2VyZyBEZWhtZWwNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgTG9jYWxpemVkRXhjZXB0aW9uDQotew0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCBhIG1lc3NhZ2UgYW5kIGEgbG9jYWxpemVkIG1lc3NhZ2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UNCi0JICogICAgICAgICAgICBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKi8NCi0JcHVibGljIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UsIGxvY2FsaXplZE1lc3NhZ2UpOwkJDQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugd2l0aCBtZXNzYWdlLCBsb2NhbGl6ZWQgbWVzc2FnZSBhbmQgY2F1c2luZyBleGNlcHRpb24uDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UNCi0JICogQHBhcmFtIGxvY2FsaXplZE1lc3NhZ2UNCi0JICogICAgICAgICAgICBsb2NhbGl6ZWQgbWVzc2FnZQ0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIGxvY2FsaXplZE1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJc3VwZXIobWVzc2FnZSwgbG9jYWxpemVkTWVzc2FnZSwgY2F1c2UpOwkJDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvRmFjZXRVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9mYWNldHMvRmFjZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODhkYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0ZhY2V0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHM7DQotDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7DQotDQotDQotcHVibGljIGNsYXNzIEZhY2V0VXRpbHMgaW1wbGVtZW50cyBJRmFjZXRVdGlscw0KLXsNCi0JLyoqDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaWYgPGM+cHJvamVjdDwvYz4gb3IgPGM+ZmFjZXRJZHM8L2M+IGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGhhc0FueUZhY2V0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZy4uLiBmYWNldElkcykgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHByb2plY3QpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZhY2V0SWRzKTsNCi0NCi0JCWlmICghaXNGYWNldGVkUHJvamVjdChwcm9qZWN0KSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBnZXRGYWNldGVkUHJvamVjdChwcm9qZWN0KTsNCi0JCWZvciAoU3RyaW5nIGZhY2V0SWQgOiBmYWNldElkcykNCi0JCXsNCi0JCQlmaW5hbCBJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWQpOw0KLQkJCWlmIChmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhc0ZhY2V0V2l0aFZlcnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZhY2V0VmVyc2lvbiwgU3RyaW5nIGZhY2V0SWQpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBoYXNGYWNldFdpdGhWZXJzaW9uKHByb2plY3QsIGZhY2V0VmVyc2lvbiwgZmFjZXRJZCwgdHJ1ZSk7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlTZXQ8SUZhY2V0ZWRQcm9qZWN0PiBmYWNldGVkUHJvamVjdHMgPSBnZXRBbGxXb3Jrc3BhY2VGYWNldGVkUHJvamVjdHMoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPElGYWNldGVkUHJvamVjdD4gaSA9IGZhY2V0ZWRQcm9qZWN0cy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGkuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIElGYWNldGVkUHJvamVjdCBmcCA9IChJRmFjZXRlZFByb2plY3QpIGkubmV4dCgpOw0KLQkJCWlmIChwcm9qZWN0LmVxdWFscyhmcC5nZXRQcm9qZWN0KCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGhhc0ZhY2V0V2l0aFZlcnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZhY2V0VmVyc2lvbiwgU3RyaW5nIGZhY2V0SWQsIGJvb2xlYW4gYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ocHJvamVjdCk7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZmFjZXRWZXJzaW9uKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmYWNldElkKTsNCi0NCi0JCWlmICghaXNGYWNldGVkUHJvamVjdChwcm9qZWN0KSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGFsbEZhY2V0c1ZlcnNpb25zID0gZ2V0UHJvamVjdEZhY2V0cyhwcm9qZWN0KTsNCi0JCWZvciAoSVByb2plY3RGYWNldFZlcnNpb24gdmVyIDogYWxsRmFjZXRzVmVyc2lvbnMpDQotCQl7DQotCQkJaWYgKHZlci5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscyhmYWNldElkKSkNCi0JCQl7DQotCQkJCXJldHVybiBpc0ZhY2V0QWNjZXB0YWJsZSh2ZXIsIGZhY2V0VmVyc2lvbiwgYWNjZXB0SGlnaGVyRmFjZXRWZXJzaW9uKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGlzRmFjZXRBY2NlcHRhYmxlKElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiwgU3RyaW5nIGZhY2V0VmVyc2lvbklkLCBib29sZWFuIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikNCi0JCQkJCQkJCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQl7DQotCQlhc3NlcnQgZmFjZXRWZXJzaW9uICE9IG51bGw7DQotDQotCQkvLyBDaGVjayBmb3IgZXhhY3QgdmVyc2lvbg0KLQkJaWYgKCFhY2NlcHRIaWdoZXJGYWNldFZlcnNpb24pDQotCQl7DQotCQkJcmV0dXJuIGZhY2V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkuZXF1YWxzKGZhY2V0VmVyc2lvbklkKTsNCi0JCX0NCi0NCi0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yID0gZmFjZXRWZXJzaW9uLmdldFByb2plY3RGYWNldCgpLmdldFZlcnNpb25Db21wYXJhdG9yKCk7DQotCQlTdHJpbmcgY3VycmVudEZhY2V0VmVyc2lvbiA9IGZhY2V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCk7DQotCQlyZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGN1cnJlbnRGYWNldFZlcnNpb24sIGZhY2V0VmVyc2lvbklkKSA+PSAwOw0KLQl9DQotDQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGdldEZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFByb2plY3RGYWNldHMoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJYXNzZXJ0IGlzRmFjZXRlZFByb2plY3QocHJvamVjdCk7DQotDQotCQlyZXR1cm4gZ2V0RmFjZXRlZFByb2plY3QocHJvamVjdCkuZ2V0UHJvamVjdEZhY2V0cygpOw0KLQl9DQotDQotCXByaXZhdGUgU2V0PElGYWNldGVkUHJvamVjdD4gZ2V0QWxsV29ya3NwYWNlRmFjZXRlZFByb2plY3RzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldEZhY2V0ZWRQcm9qZWN0cygpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0lGYWNldFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ZhY2V0cy9JRmFjZXRVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NzI3NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvZmFjZXRzL0lGYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi0JDQotcHVibGljIGludGVyZmFjZSBJRmFjZXRVdGlscw0KLXsNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBFSkIzMCBmYWNldCBJRA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCXzMwX0ZBQ0VUX0lEID0gImpzdC5lamIiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIEVKQjMwIGZhY2V0IHZlcnNpb24gMy4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfMzBfRkFDRVRfVkVSU0lPTiA9ICIzLjAiOyAvLyROT04tTkxTLTEkDQotCQ0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIFdlYiAyLjUgZmFjZXQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl8yNV9GQUNFVF9JRCA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBXZWIgZmFjZXQgdmVyc2lvbiAyLjUNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl8yNV9GQUNFVF9WRVJTSU9OID0gIjIuNSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIENvbnN0YW50IGZvciBBcHBsaWNhdGlvbiBjbGllbnQgZmFjZXQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF8yNV9GQUNFVF9JRCA9ICJqc3QuYXBwY2xpZW50IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RhbnQgZm9yIEFwcGxpY2F0aW9uIGNsaWVudCBmYWNldCB2ZXJzaW9uIDIuNQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UXzI1X0ZBQ0VUX1ZFUlNJT04JPSAiNS4wIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ2hlY2tzIHdoZXRoZXIgPGNvZGU+cHJvamVjdDwvY29kZT4gaGFzIGEgZmFjZXQgd2l0aCBpZCA8Y29kZT5mYWNldElkPC9jb2RlPiB3aXRoIHZlcnNpb24gPGNvZGU+ZmFjZXRWZXJzaW9uPC9jb2RlPg0KLQkgKiBJbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBub3QgYSBmYWNldGVkIHByb2plY3QsIGZhbHNlIGlzIHJldHVybmVkIA0KLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaXMgZXF1aXZhbGVudCB0byBpbnZva2luZyBoYXNGYWNldFdpdGhWZXJzaW9uKHByb2plY3QsIGZhY2V0VmVyc2lvbiwgZmFjZXRJZCwgZmFsc2UpDQotCSAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0DQotCSAqIEBwYXJhbSBmYWNldFZlcnNpb24gdGhlIGZhY2V0IHZlcnNpb24NCi0JICogQHBhcmFtIGZhY2V0SWQgdGhlIGZhY2V0IGlkDQotCSAqIEByZXR1cm4gdHJ1ZSBpbiBjYXNlIHRoZSBwcm9qZWN0IHNwZWNpZmllZCBpcyBhIGZhY2V0ZWQgcHJvamVjdCBhbmQgaGFzIHRoZSBmYWNldCB3aXRoIHRoZSB2ZXJzaW9uIHNwZWNpZmllZDsgZmFsc2Ugb3RoZXJ3aXNlDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gYW55IG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGlzIG51bGwNCi0JICogQHNlZSBJRmFjZXRVdGlscyNoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0LCBTdHJpbmcsIFN0cmluZywgYm9vbGVhbikNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGhhc0ZhY2V0V2l0aFZlcnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZhY2V0VmVyc2lvbiwgU3RyaW5nIGZhY2V0SWQpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQkNCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIDxjb2RlPnByb2plY3Q8L2NvZGU+IGhhcyBhIGZhY2V0IHdpdGggaWQgPGNvZGU+ZmFjZXRJZDwvY29kZT4gd2l0aCB2ZXJzaW9uIDxjb2RlPmZhY2V0VmVyc2lvbjwvY29kZT4NCi0JICogSW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgbm90IGEgZmFjZXRlZCBwcm9qZWN0LCBmYWxzZSBpcyByZXR1cm5lZCANCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QNCi0JICogQHBhcmFtIGZhY2V0VmVyc2lvbiB0aGUgZmFjZXQgdmVyc2lvbg0KLQkgKiBAcGFyYW0gZmFjZXRJZCB0aGUgZmFjZXQgaWQNCi0JICogQHBhcmFtIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbiBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGhpZ2hlciBmYWNldCB2ZXJzaW9ucyBhcmUgYWNjZXB0YWJsZQ0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBmYWNldGVkIHByb2plY3QgYW5kIGhhcyB0aGUgZmFjZXQgd2l0aCB0aGUgdmVyc2lvbiBzcGVjaWZpZWQ7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGFueSBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGYWNldFdpdGhWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBmYWNldFZlcnNpb24sIFN0cmluZyBmYWNldElkLCBib29sZWFuIGFjY2VwdEhpZ2hlckZhY2V0VmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBmYWNldGVkIHByb2plY3QNCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QNCi0JICogQHJldHVybg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY2V0ZWRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkJhc2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkJhc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyZWRhMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25CYXNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkJhc2U7DQotDQotLyoqDQotICogQmFzZSB7QGxpbmsgSUFubm90YXRpb25CYXNlfSBpbXBsZW1lbnRhdGlvbg0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uQmFzZUltcGw8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIGFubm90YXRpb25OYW1lOy8vIENvbnRhaW5lciBmb3IgQW5ub3RhdGlvbiBOYW1lOw0KLQlwcm90ZWN0ZWQgVCBqYXZhRWxlbWVudDsgLy8gQ29uYXRpbmVyIGZvciB0aGUgcGFyZW50IElKYXZhRWxlbWVudDsNCi0JLy9wcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uU3RyaW5nVmFsdWU7Ly9Db25hdGluZXIgdG8gY3VycmVudCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhbm5vdGF0aW9uDQotCQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvci4NCi0JICogDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uTmFtZQ0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmFubm90YXRpb25OYW1lPC9jb2RlPiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmFubm90YXRpb25OYW1lPC9jb2RlPiBpcyBlbXB0eSBTdHJpbmcuDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkJhc2VJbXBsKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJdGhpcy5hbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lOw0KLQl9DQotDQotCS8qKg0KLQkgKiBFeHRyYWN0cyBvbmx5IHRoZSBBbm5vdGF0aW9uIG5hbWUgaW4gY2FzZSBpdCBpcyBpbiBmdWxseSBxdWFsaWZpZWQgZm9ybS4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHNpbXBsZSBBbm5vdGF0aW9uIG5hbWUuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZUFubm90YXRpb25OYW1lKCkNCi0Jew0KLQkJaW50IGxhc3REb3RJbmRleCA9IGFubm90YXRpb25OYW1lLmxhc3RJbmRleE9mKERPVCk7DQotDQotCQlpZiAobGFzdERvdEluZGV4ID09IC0xKQ0KLQkJew0KLQkJCXJldHVybiBhbm5vdGF0aW9uTmFtZTsNCi0JCX0NCi0NCi0JCXJldHVybiBhbm5vdGF0aW9uTmFtZS5zdWJzdHJpbmcobGFzdERvdEluZGV4ICsgMSk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpDQotCXsNCi0JCXJldHVybiBhbm5vdGF0aW9uTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBBbm5vdGF0aW9uIHRvIHNwZWNpZmljIElKYXZhRWxlbWVudC4NCi0JICogDQotCSAqIEBwYXJhbSBqYXZhRWxlbWVudA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8dHQ+amF2YUVsZW1lbnQ8L3R0PiBpcyBudWxsLg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIDxjb2RlPmphdmFFbGVtZW50PC9jb2RlPiBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4gU3VwcG9ydGVkIHR5cGVzIGFyZTogSVR5cGUsIElNZXRob2QsIElGaWVsZCwgSVR5cGVQYXJhbWV0ZXIuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKFQgamF2YUVsZW1lbnQpDQotCXsNCi0JCXNldEphdmFFbGVtZW50KGphdmFFbGVtZW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRKYXZhRWxlbWVudChUIGphdmFFbGVtZW50KQ0KLQl7DQotCQlpZiAoamF2YUVsZW1lbnQgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImphdmFFbGVtZW50IHNob3VsZCBub3QgYmUgbnVsbCEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSAmJiAhKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElGaWVsZCkgJiYgIShqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJqYXZhRWxlbWVudCBpcyBub3Qgb2YgY29ycmVjdCB0eXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQl0aGlzLmphdmFFbGVtZW50ID0gamF2YUVsZW1lbnQ7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUuaGFzaENvZGUoKTsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikNCi0Jew0KLQkJaWYgKHRoaXMgPT0gb2JqKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKG9iaiA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEFubm90YXRpb25CYXNlSW1wbDxUPiBvdGhlciA9ICAoQW5ub3RhdGlvbkJhc2VJbXBsPFQ+KW9iajsNCi0JCXJldHVybiBhbm5vdGF0aW9uTmFtZS5lcXVhbHMob3RoZXIuYW5ub3RhdGlvbk5hbWUpOw0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZDNiNWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi0NCi0vKioNCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUFubm90YXRpb259DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25JbXBsPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IGV4dGVuZHMgQW5ub3RhdGlvbkJhc2VJbXBsPFQ+IGltcGxlbWVudHMgSUFubm90YXRpb248VD4NCi17DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbiNnZXRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5TdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoU3RyaW5nIHBhcmFtKQ0KLQl7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYWlyIDogZ2V0UGFyYW1WYWx1ZVBhaXJzKCkpDQotCQl7DQotCQkJaWYgKHBhcmFtLmVxdWFscyhwYWlyLmdldFBhcmFtKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHBhaXIuZ2V0VmFsdWUoKSE9bnVsbCA/IHBhaXIuZ2V0VmFsdWUoKS50b1N0cmluZygpIDogbnVsbDsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVQYWlyczsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGFubm90YXRpb24NCi0JICogQHBhcmFtIHBhcmFtVmFsdWVQYWlycyAtDQotCSAqICAgICAgICAgICAgdGhlIHBhcmFtPXZhbHVlIHBhcmlzDQotCSAqLw0KLQlwdWJsaWMgQW5ub3RhdGlvbkltcGwoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMpDQotCXsNCi0JCXN1cGVyKGFubm90YXRpb25OYW1lKTsNCi0JCXRoaXMucGFyYW1WYWx1ZVBhaXJzID0gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotDQotCXB1YmxpYyBTZXQ8SVBhcmFtVmFsdWVQYWlyPiBnZXRQYXJhbVZhbHVlUGFpcnMoKQ0KLQl7DQotCQlyZXR1cm4gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFBhcmFtVmFsdWVQYWlycyhTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlUGFpcnMpDQotCXsNCi0JCXRoaXMucGFyYW1WYWx1ZVBhaXJzID0gcGFyYW1WYWx1ZVBhaXJzOw0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCU5vcm1hbEFubm90YXRpb24gYW5ub3QgPSBhc3QubmV3Tm9ybWFsQW5ub3RhdGlvbigpOw0KLQkJYm9vbGVhbiB3YXNBZGRlZCA9IGFkZEltcG9ydHMoYXN0LCB1bml0LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWlmICh3YXNBZGRlZCkNCi0JCXsNCi0JCQkoKFNpbXBsZU5hbWUpIGFubm90LmdldFR5cGVOYW1lKCkpLnNldElkZW50aWZpZXIoZ2V0U2ltcGxlQW5ub3RhdGlvbk5hbWUoKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlOYW1lIG5hbWUgPSBhc3QubmV3TmFtZShnZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCQlhbm5vdC5zZXRUeXBlTmFtZShuYW1lKTsNCi0JCX0NCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFyYW1WYWx1ZVBhaXJzKQ0KLQkJew0KLQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gYXN0Lm5ld01lbWJlclZhbHVlUGFpcigpOw0KLQkJCXBhaXIuZ2V0TmFtZSgpLnNldElkZW50aWZpZXIocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKSk7DQotCQkJcGFpci5zZXRWYWx1ZSgoKFZhbHVlSW1wbCkgcGFyYW1WYWx1ZVBhaXIuZ2V0VmFsdWUoKSkuZ2V0RXhwcmVzc2lvbih1bml0LCBhc3QpKTsNCi0JCQlhbm5vdC52YWx1ZXMoKS5hZGQocGFpcik7DQotCQl9DQotCQlyZXR1cm4gYW5ub3Q7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlpZihwYXJhbVZhbHVlUGFpcnMgPT0gbnVsbCB8fCBwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpIDwgMSkNCi0JCXsNCi0JCQlyZXR1cm4gMzEgKiBzdXBlci5oYXNoQ29kZSgpOw0KLQkJfQ0KLQkJcmV0dXJuIDMxICogc3VwZXIuaGFzaENvZGUoKSArIEFycmF5cy5oYXNoQ29kZShwYXJhbVZhbHVlUGFpcnMudG9BcnJheShuZXcgSVBhcmFtVmFsdWVQYWlyW3BhcmFtVmFsdWVQYWlycy5zaXplKCldKSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCWZpbmFsIEFubm90YXRpb25JbXBsPD8+IG90aGVyID0gKEFubm90YXRpb25JbXBsPD8+KSBvYmo7DQotCQlyZXR1cm4gKEFycmF5cy5lcXVhbHMocGFyYW1WYWx1ZVBhaXJzLnRvQXJyYXkobmV3IElQYXJhbVZhbHVlUGFpcltwYXJhbVZhbHVlUGFpcnMuc2l6ZSgpXSksIG90aGVyLnBhcmFtVmFsdWVQYWlycy50b0FycmF5KG5ldyBJUGFyYW1WYWx1ZVBhaXJbcGFyYW1WYWx1ZVBhaXJzLnNpemUoKV0pKSk7DQotCX0NCi0NCi0JcHVibGljIFQgZ2V0QXBwbGllZEVsZW1lbnQoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5qYXZhRWxlbWVudDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvbkluc3BlY3RvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyYzg2N2UxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uSW5zcGVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5RdWFsaWZpZWROYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb25JbnNwZWN0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6LkFTVFV0aWxzOw0KLQ0KLS8qKg0KLSAqIENsYXNzLCB3aGljaCBpcyBtYWRlIHRvIGxvYWQgYW5kIHJldHVybiBhbm5vdGF0aW9ucyBmcm9tIGEgZ2l2ZW4gSUphdmFFbGVtZXQuDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25JbnNwZWN0b3JJbXBsIGltcGxlbWVudHMgSUFubm90YXRpb25JbnNwZWN0b3INCi17DQotCXByaXZhdGUgSVR5cGUgaVR5cGU7DQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0IGNVbml0Ow0KLQ0KLQlwdWJsaWMgQW5ub3RhdGlvbkluc3BlY3RvckltcGwoZmluYWwgSVR5cGUgdHlwZSkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHR5cGUsICJ0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJdGhpcy5pVHlwZSA9IHR5cGU7DQotCX0JDQotDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJTWV0aG9kPiBpbnNwZWN0TWV0aG9kKGZpbmFsIElNZXRob2QgbWV0aG9kLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShtZXRob2QsICJtZXRob2QiKTsgLy8kTk9OLU5MUy0xJA0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGFubm90YXRpb25RTmFtZSwgImFubm90YXRpb25RTmFtZSIpOyAvLyROT04tTkxTLTEkDQotCQlpZighKG1ldGhvZCBpbnN0YW5jZW9mIElNZXRob2QpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIobWV0aG9kLCBtZXRob2QuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSwgYW5ub3RhdGlvblFOYW1lKTsJCQ0KLQl9CQ0KLQ0KLQlwdWJsaWMgQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gaW5zcGVjdE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0obWV0aG9kLCAibWV0aG9kIik7IC8vJE5PTi1OTFMtMSQNCi0JCQ0KLQkJaWYoIShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsJLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGdldEZyb21NZW1iZXIobWV0aG9kLCBtZXRob2QuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIElBbm5vdGF0aW9uPElGaWVsZD4gaW5zcGVjdEZpZWxkKGZpbmFsIElGaWVsZCBmaWVsZCwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShmaWVsZCwgImZpZWxkIik7IC8vJE5PTi1OTFMtMSQNCi0JCW51bGxDaGVja1BhcmFtKGFubm90YXRpb25RTmFtZSwgImFubm90YXRpb25RTmFtZSIpOyAvLyROT04tTkxTLTEkDQotDQotCQlpZighKGZpZWxkIGluc3RhbmNlb2YgSUZpZWxkKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWVsZCBhcmd1bWVudCBpcyBub3Qgb2YgY29ycmVjdCBUeXBlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihhbm5vdGF0aW9uUU5hbWUudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhbm5vdGF0aW9uUU5hbWUgYXJndW1lbnQgaXMgbm90IHdpdGggcHJvcHBlciB2YWx1ZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGZpZWxkLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uRnJvbU1lbWJlcihmaWVsZCwgY2xhc3NOYW1lLCBhbm5vdGF0aW9uUU5hbWUpOwkJDQotCX0NCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElGaWVsZD4+IGluc3BlY3RGaWVsZChJRmllbGQgZmllbGQpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGZpZWxkID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWVsZCBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEoZmllbGQgaW5zdGFuY2VvZiBJRmllbGQpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpZWxkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWVsZC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJcmV0dXJuIGdldEZyb21NZW1iZXIoZmllbGQsIGNsYXNzTmFtZSk7DQotCX0NCi0NCi0JcHVibGljIElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBpbnNwZWN0UGFyYW0oZmluYWwgSVR5cGVQYXJhbWV0ZXIgcGFyYW0sIGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uUU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJbnVsbENoZWNrUGFyYW0ocGFyYW0sICJwYXJhbSIpOyAvLyROT04tTkxTLTEkDQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlpZighKHBhcmFtIGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmFtIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IFR5cGUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKGFubm90YXRpb25RTmFtZS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFubm90YXRpb25RTmFtZSBhcmd1bWVudCBpcyBub3Qgd2l0aCBwcm9wcGVyIHZhbHVlISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lRnJvbVBhcmFtKHBhcmFtKTsNCi0JCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb25Gcm9tTWVtYmVyKHBhcmFtLCBjbGFzc05hbWUsIGFubm90YXRpb25RTmFtZSk7CQkNCi0JfQ0KLQkNCi0JcHVibGljIENvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+PiBpbnNwZWN0UGFyYW0oSVR5cGVQYXJhbWV0ZXIgcGFyYW0pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHBhcmFtID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSBzaG91bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCEocGFyYW0gaW5zdGFuY2VvZiBJVHlwZVBhcmFtZXRlcikpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyYW0gYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgVHlwZSEiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGdldEZyb21NZW1iZXIocGFyYW0sIGdldENsYXNzTmFtZUZyb21QYXJhbShwYXJhbSkpOw0KLQl9DQotDQotCXB1YmxpYyBJQW5ub3RhdGlvbjxJVHlwZT4gaW5zcGVjdFR5cGUoZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQludWxsQ2hlY2tQYXJhbShhbm5vdGF0aW9uUU5hbWUsICJhbm5vdGF0aW9uUU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlpZiAoYW5ub3RhdGlvblFOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYW5ub3RhdGlvblFOYW1lIGFyZ3VtZW50IGlzIG5vdCB3aXRoIHByb3BwZXIgdmFsdWUhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIoaVR5cGUsIGlUeXBlLmdldEVsZW1lbnROYW1lKCksIGFubm90YXRpb25RTmFtZSk7DQotCX0NCi0JDQotCXB1YmxpYyBDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gaW5zcGVjdFR5cGUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiBnZXRGcm9tTWVtYmVyKGlUeXBlLCBpVHlwZS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JfQkNCi0JDQotCS8vICMgaW1wbGVtZW50YXRpb24NCi0JDQotCXByaXZhdGUgU3RyaW5nIGdldENsYXNzTmFtZUZyb21QYXJhbShmaW5hbCBJVHlwZVBhcmFtZXRlciBwYXJhbSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZihwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKSBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJcmV0dXJuIHBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpLmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCk7DQotCQl9DQotDQotCQlyZXR1cm4gcGFyYW0uZ2V0RGVjbGFyaW5nTWVtYmVyKCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNldDxJQW5ub3RhdGlvbjxUPj4gZ2V0RnJvbU1lbWJlcihUIHR5cGUsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJaWYgKCFpc1N1cHBvcnRlZEphdmFFbGVtZW50KHR5cGUpKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFzc2VkIGFyZ3VtZW50IGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUuIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IG51bGw7DQotCQlpZih0eXBlIGluc3RhbmNlb2YgSU1lbWJlcikgew0KLQkJCWNVbml0ID0gKChJTWVtYmVyKXR5cGUpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJY1VuaXQgPSAoKElUeXBlUGFyYW1ldGVyKXR5cGUpLmdldERlY2xhcmluZ01lbWJlcigpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJfQ0KLQkJDQotCQlpZiAoY1VuaXQgPT0gbnVsbCkgew0KLQkJCXJldHVybiBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JCX0NCi0NCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlmaW5hbCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJDQotCQlzd2l0Y2godHlwZS5nZXRFbGVtZW50VHlwZSgpKQ0KLQkJew0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToNCi0JCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbnModHlwZSwgdHlwZURlY2xhcmF0aW9uKTsNCi0JCQkNCi0JCWNhc2UgSUphdmFFbGVtZW50LkZJRUxEOg0KLQkJCUZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbigoSUZpZWxkKSB0eXBlLCAoVHlwZURlY2xhcmF0aW9uKXR5cGVEZWNsYXJhdGlvbik7DQotCQkJcmV0dXJuIGdldEFubm90YXRpb25zKHR5cGUsIGZpZWxkRGVjbGFyYXRpb24pOw0KLQkJCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOg0KLQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbigoSU1ldGhvZCkgdHlwZSwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRBbm5vdGF0aW9ucyh0eXBlLCBtZXRob2REZWNsYXJhdGlvbik7DQotCQkJDQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFX1BBUkFNRVRFUjoNCi0JCQltZXRob2REZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24oKElNZXRob2QpKChJVHlwZVBhcmFtZXRlcikgdHlwZSkuZ2V0UGFyZW50KCksIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0UGFyYW1Bbm5vdGF0aW9ucyh0eXBlLCBtZXRob2REZWNsYXJhdGlvbik7DQotCQl9DQotDQotCQlyZXR1cm4gbmV3IEhhc2hTZXQ8SUFubm90YXRpb248VD4+KCk7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNldDxJQW5ub3RhdGlvbjxUPj4gZ2V0QW5ub3RhdGlvbnMoVCBpTWVtYmVyLCBCb2R5RGVjbGFyYXRpb24gYm9keURlY2xhcmF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChib2R5RGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlMaXN0IGxpc3QgPSBib2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7DQotCQkJcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhpTWVtYmVyLCBsaXN0KTsNCi0JCX0NCi0JCXJldHVybiBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JfQ0KLQkNCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNldDxJQW5ub3RhdGlvbjxUPj4gZ2V0UGFyYW1Bbm5vdGF0aW9ucyhUIGlNZW1iZXIsIE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmIChtZXRob2REZWNsYXJhdGlvbiAhPSBudWxsKQ0KLQkJew0KLQkJCWZvciAoT2JqZWN0IHBhcmFtIDogbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpKQ0KLQkJCXsNCi0JCQkJaWYgKHBhcmFtIGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiAmJg0KLQkJCQkJCSgoSVR5cGVQYXJhbWV0ZXIpaU1lbWJlcikuZ2V0RWxlbWVudE5hbWUoKS50b1N0cmluZygpLmVxdWFscygoKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pcGFyYW0pLmdldE5hbWUoKS50b1N0cmluZygpKSkNCi0JCQkJew0KLQkJCQkJTGlzdCBsaXN0ID0gKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJhbSkubW9kaWZpZXJzKCk7DQotCQkJCQ0KLQkJCQkJcmV0dXJuIGV4dHJhY3RBbm5vdGF0aW9ucyhpTWVtYmVyLCBsaXN0KTsNCi0JCQkJfQ0KLQkJCX0JCQkNCi0JCX0NCi0JCXJldHVybiBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JfQ0KLQkNCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNldDxJQW5ub3RhdGlvbjxUPj4gZXh0cmFjdEFubm90YXRpb25zKFQgaU1lbWJlciwgTGlzdCBsaXN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSUV4dGVuZGVkTW9kaWZpZXIgZWxlbWVudCA9IChJRXh0ZW5kZWRNb2RpZmllcikgaXRlci5uZXh0KCk7DQotCQkJaWYgKGVsZW1lbnQuaXNBbm5vdGF0aW9uKCkpDQotCQkJew0KLQkJCQl2YWx1ZXMuYWRkKGNvbnZlcnRFeHByZXNzaW9uKChFeHByZXNzaW9uKSBlbGVtZW50KSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJU2V0PElBbm5vdGF0aW9uPFQ+PiBleHByZXNzaW9ucyA9IG5ldyBIYXNoU2V0PElBbm5vdGF0aW9uPFQ+PigpOw0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpIA0KLQkJew0KLQkJCUFubm90YXRpb25JbXBsPFQ+IGFubiA9IChBbm5vdGF0aW9uSW1wbDxUPil2YWx1ZTsNCi0JCQlhbm4uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShpTWVtYmVyKTsNCi0JCQlleHByZXNzaW9ucy5hZGQoYW5uKTsNCi0JCX0NCi0JCXJldHVybiBleHByZXNzaW9uczsJCQ0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gZXh0cmFjdFNwZWNpZmljQW5ub3RhdGlvbihUIGlNZW1iZXIsIExpc3QgbGlzdCwgSVR5cGUgdHlwZSwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOw0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlFeHRlbmRlZE1vZGlmaWVyIGVsZW1lbnQgPSAoSUV4dGVuZGVkTW9kaWZpZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWlmIChlbGVtZW50LmlzQW5ub3RhdGlvbigpKQ0KLQkJCXsJCQkJDQotCQkJCWZpbmFsIE5hbWUgdHlwZU5hbWUgPSAoKEFubm90YXRpb24pZWxlbWVudCkuZ2V0VHlwZU5hbWUoKTsNCi0JCQkJaWYgKGFubm90YXRpb25RTmFtZS5lbmRzV2l0aCh0eXBlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIHsNCi0JCQkJCXZhbHVlcy5hZGQoY29udmVydEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIGVsZW1lbnQpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWZvciAoSVZhbHVlIHZhbHVlIDogdmFsdWVzKSANCi0JCXsNCi0JCQlBbm5vdGF0aW9uSW1wbDxUPiB0bXBBbm5vdGF0aW9uID0gKEFubm90YXRpb25JbXBsPFQ+KXZhbHVlOw0KLQkJCWlmKGNoZWNrU3BlY2lmaWNBbm5vdGF0dGlvbih0bXBBbm5vdGF0aW9uLCB0eXBlLCBhbm5vdGF0aW9uUU5hbWUpKQ0KLQkJCXsNCi0JCQkJQW5ub3RhdGlvbkltcGw8VD4gcmVzdWx0ID0gbmV3IEFubm90YXRpb25JbXBsPFQ+KGFubm90YXRpb25RTmFtZSwgdG1wQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSk7DQotCQkJCXJlc3VsdC5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGlNZW1iZXIpOw0KLQkJCQlyZXN1bHQuc2V0TG9jYXRvcih0bXBBbm5vdGF0aW9uLmdldExvY2F0b3IoKSk7DQotCQkJCXJldHVybiByZXN1bHQ7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7CQkNCi0JfQkNCi0NCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gYm9vbGVhbiBjaGVja1NwZWNpZmljQW5ub3RhdHRpb24oZmluYWwgQW5ub3RhdGlvbkltcGw8VD4gYW5ub3RhdGlvbiwgZmluYWwgSVR5cGUgdHlwZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25RTmFtZSkgfHwgDQotCQkJCSh0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCkgKyAiLiIgKyBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpLmVxdWFscyhhbm5vdGF0aW9uUU5hbWUpKSAvLyROT04tTkxTLTEkDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQkNCi0JCUlDb21waWxhdGlvblVuaXQgY1VuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJSUltcG9ydERlY2xhcmF0aW9uW10gaW1wb3J0cyA9IGNVbml0LmdldEltcG9ydHMoKTsNCi0JCWZvciAoSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogaW1wb3J0cykNCi0JCXsNCi0JCQlpZihhbm5vdGF0aW9uUU5hbWUuZW5kc1dpdGgoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSAmJiBpbXBvcnREZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uUU5hbWUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlmb3IgKElJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA6IGltcG9ydHMpDQotCQl7DQotCQkJaWYoaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5lbmRzV2l0aCgiKiIpKSAvLyROT04tTkxTLTEkDQotCQkJew0KLQkJCQlTdHJpbmcgaW1wb3J0U3RyID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5zdWJzdHJpbmcoMCwgaW1wb3J0RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKS5sZW5ndGgoKSAtIDEpOw0KLQkJCQlpZihhbm5vdGF0aW9uUU5hbWUuZW5kc1dpdGgoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSAmJiBhbm5vdGF0aW9uUU5hbWUuaW5kZXhPZihpbXBvcnRTdHIpID09IDApDQotCQkJCXsNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgSVZhbHVlIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0Tm9kZVR5cGUoKSkNCi0JCXsNCi0JCQljYXNlIEFTVE5vZGUuTUFSS0VSX0FOTk9UQVRJT046DQotCQkJew0KLQkJCQlNYXJrZXJBbm5vdGF0aW9uIG1hID0gKE1hcmtlckFubm90YXRpb24pIGVsZW1lbnQ7DQotCQkJCUFubm90YXRpb25JbXBsIGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGwoZ2V0RnVsbHlRdWFsaWZpZWRBbm5vdGF0aW9uTmFtZShtYSksIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotCQkJCWFubm90YXRpb24uc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKG1hKSk7DQotCQkJCXJldHVybiBhbm5vdGF0aW9uOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OOg0KLQkJCXsNCi0JCQkJZmluYWwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBzbWEgPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZWxlbWVudDsNCi0JCQkJZmluYWwgU2V0PElQYXJhbVZhbHVlUGFpcj4gdmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJCQlmaW5hbCBJVmFsdWUgdmFsdWUgPSBjb252ZXJ0RXhwcmVzc2lvbihzbWEuZ2V0VmFsdWUoKSk7DQotCQkJCWlmICh2YWx1ZSE9bnVsbCkgew0KLQkJCQkJdmFsdWVzLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJ2YWx1ZSIsIHZhbHVlKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJfQ0KLQkJCQkNCi0JCQkJQW5ub3RhdGlvbkltcGwgYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbChnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKHNtYSksIHZhbHVlcyk7DQotCQkJCWFubm90YXRpb24uc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHNtYSkpOw0KLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLk5PUk1BTF9BTk5PVEFUSU9OOg0KLQkJCXsNCi0JCQkJcmV0dXJuIGdldE5vcm1hbEFubm90YXRpb25WYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgZWxlbWVudCk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUjoNCi0JCQl7DQotCQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyID0gKEFycmF5SW5pdGlhbGl6ZXIpIGVsZW1lbnQ7DQotCQkJCUxpc3Q8RXhwcmVzc2lvbj4gbGlzdCA9IGFyci5leHByZXNzaW9ucygpOw0KLQkJCQlJdGVyYXRvcjxFeHByZXNzaW9uPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOw0KLQkJCQlTZXQ8SVZhbHVlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkNCi0JCQkJew0KLQkJCQkJRXhwcmVzc2lvbiBleHByID0gKEV4cHJlc3Npb24pIGl0ZXIubmV4dCgpOw0KLQkJCQkJcmVzdWx0LmFkZChjb252ZXJ0RXhwcmVzc2lvbihleHByKSk7DQotCQkJCX0NCi0JCQkJcmV0dXJuIG5ldyBBcnJheVZhbHVlSW1wbChyZXN1bHQpOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuTlVMTF9MSVRFUkFMOg0KLQkJCXsNCi0JCQkJLy8gcmV0dXJuIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZU51bGxWYWx1ZSgpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOg0KLQkJCXsNCi0JCQkJYnJlYWs7Ly9yZXR1cm4gbmV3IFN0cmluZ1ZhbHVlSW1wbCgoKFNpbXBsZU5hbWUpZWxlbWVudCkuZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLlRZUEVfTElURVJBTDoNCi0JCQl7DQotCQkJCXJldHVybiBnZXRUeXBlTGl0ZXJhbFZhbHVlKChUeXBlTGl0ZXJhbCkgZWxlbWVudCk7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRToNCi0JCQl7DQotCQkJCVF1YWxpZmllZE5hbWUgcW4gPSAoUXVhbGlmaWVkTmFtZSkgZWxlbWVudDsNCi0JCQkJUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCBxblZhbHVlID0gbmV3IFF1YWxpZmllZE5hbWVWYWx1ZUltcGwocW4uZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJCQlxblZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihxbikpOw0KLQkJCQlyZXR1cm4gcW5WYWx1ZTsNCi0JCQl9DQotCQkJY2FzZSBBU1ROb2RlLkJPT0xFQU5fTElURVJBTDoNCi0JCQl7DQotCQkJCUJvb2xlYW5MaXRlcmFsIGJsID0gKEJvb2xlYW5MaXRlcmFsKSBlbGVtZW50Ow0KLQkJCQlCb29sZWFuVmFsdWVJbXBsIGJWYWx1ZSA9IG5ldyBCb29sZWFuVmFsdWVJbXBsKGJsLmJvb2xlYW5WYWx1ZSgpKTsNCi0JCQkJYlZhbHVlLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihibCkpOw0KLQkJCQlyZXR1cm4gYlZhbHVlOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuQ0hBUkFDVEVSX0xJVEVSQUw6DQotCQkJew0KLQkJCQkvLyBDaGFyYWN0ZXJMaXRlcmFsIGNsID0gKENoYXJhY3RlckxpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCS8vIFRPRE8gRmluaXNoIHdpdGggdGhpcyByZXR1cm4gbmV3IENoYXJhY3RlclZhbHVlKGNsLmNoYXJWYWx1ZSgpKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhc2UgQVNUTm9kZS5OVU1CRVJfTElURVJBTDoNCi0JCQl7DQotCQkJCU51bWJlckxpdGVyYWwgbmwgPSAoTnVtYmVyTGl0ZXJhbCkgZWxlbWVudDsNCi0JCQkJSW50ZWdlclZhbHVlSW1wbCBpbnRWYWx1ZSA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKG5sLmdldFRva2VuKCkpOw0KLQkJCQlpbnRWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobmwpKTsNCi0JCQkJcmV0dXJuIGludFZhbHVlOw0KLQkJCX0NCi0JCQljYXNlIEFTVE5vZGUuU1RSSU5HX0xJVEVSQUw6DQotCQkJew0KLQkJCQlTdHJpbmdMaXRlcmFsIHNsID0gKFN0cmluZ0xpdGVyYWwpIGVsZW1lbnQ7DQotCQkJCVN0cmluZ1ZhbHVlSW1wbCBzdHJWYWx1ZSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoc2wuZ2V0TGl0ZXJhbFZhbHVlKCkpOw0KLQkJCQlzdHJWYWx1ZS5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3Ioc2wpKTsNCi0JCQkJcmV0dXJuIHN0clZhbHVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcml2YXRlIElWYWx1ZSBnZXRUeXBlTGl0ZXJhbFZhbHVlKFR5cGVMaXRlcmFsIHRsKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCVR5cGUgdHlwZSA9IHRsLmdldFR5cGUoKTsNCi0JCU5hbWUgbmFtZSA9IG51bGw7DQotCQlpZiAodHlwZS5pc1F1YWxpZmllZFR5cGUoKSkNCi0JCXsNCi0JCQluYW1lID0gKChRdWFsaWZpZWRUeXBlKSB0eXBlKS5nZXROYW1lKCk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQlpZiAodHlwZS5pc1NpbXBsZVR5cGUoKSkNCi0JCQl7DQotCQkJCW5hbWUgPSAoKFNpbXBsZVR5cGUpIHR5cGUpLmdldE5hbWUoKTsNCi0JCQl9DQotCQl9DQotCQlpZiAobmFtZSAhPSBudWxsKQ0KLQkJew0KLQkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCh0bCk7DQotCQkJaWYgKGN1ICE9IG51bGwpDQotCQkJew0KLQkJCQlTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lID0gbmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCQkJaWYgKHR5cGUuaXNTaW1wbGVUeXBlKCkpDQotCQkJCXsNCi0JCQkJCWZ1bGx5UXVhbGlmaWVkTmFtZSA9IHJlc29sdmVUeXBlKChJQ29tcGlsYXRpb25Vbml0KSBjdS5nZXRKYXZhRWxlbWVudCgpLCBmdWxseVF1YWxpZmllZE5hbWUpOw0KLQkJCQl9DQotDQotCQkJCUNsYXNzVmFsdWVJbXBsIGNWYWx1ZSA9IG5ldyBDbGFzc1ZhbHVlSW1wbChmdWxseVF1YWxpZmllZE5hbWUpOw0KLQkJCQljVmFsdWUuc2V0TG9jYXRvcihjcmVhdGVMb2NhdG9yKHRsKSk7DQotCQkJCXJldHVybiBjVmFsdWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIElWYWx1ZSBnZXROb3JtYWxBbm5vdGF0aW9uVmFsdWUoTm9ybWFsQW5ub3RhdGlvbiBuYSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gbCA9IG5hLnZhbHVlcygpOw0KLQkJSXRlcmF0b3I8TWVtYmVyVmFsdWVQYWlyPiBpdGVyID0gbC5pdGVyYXRvcigpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCU1lbWJlclZhbHVlUGFpciBtdnAgPSAoTWVtYmVyVmFsdWVQYWlyKSBpdGVyLm5leHQoKTsNCi0JCQlJVmFsdWUgbXZwdmFsID0gY29udmVydEV4cHJlc3Npb24obXZwLmdldFZhbHVlKCkpOw0KLQkJCVBhcmFtVmFsdWVQYWlySW1wbCBwYWlyID0gbmV3IFBhcmFtVmFsdWVQYWlySW1wbChtdnAuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgbXZwdmFsKTsNCi0JCQlwYWlyLnNldExvY2F0b3IoY3JlYXRlTG9jYXRvcihtdnApKTsNCi0JCQlyZXN1bHQuYWRkKHBhaXIpOw0KLQkJfQ0KLQkJDQotCQlBbm5vdGF0aW9uSW1wbCBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsKGdldEZ1bGx5UXVhbGlmaWVkQW5ub3RhdGlvbk5hbWUobmEpLCByZXN1bHQpOw0KLQkJYW5ub3RhdGlvbi5zZXRMb2NhdG9yKGNyZWF0ZUxvY2F0b3IobmEpKTsNCi0JCXJldHVybiBhbm5vdGF0aW9uOw0KLQl9CQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEFubm90YXRpb25OYW1lKEFubm90YXRpb24gYW5ubykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlOYW1lIHR5cGVOYW1lID0gYW5uby5nZXRUeXBlTmFtZSgpOw0KLQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IHR5cGVOYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOw0KLQkJaWYgKHR5cGVOYW1lLmlzU2ltcGxlTmFtZSgpKQ0KLQkJew0KLQkJCUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdChhbm5vKTsNCi0JCQlmdWxseVF1YWxpZmllZE5hbWUgPSByZXNvbHZlVHlwZSgoSUNvbXBpbGF0aW9uVW5pdCkgY3UuZ2V0SmF2YUVsZW1lbnQoKSwgZnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCX0NCi0JCXJldHVybiBmdWxseVF1YWxpZmllZE5hbWU7DQotCX0NCi0JDQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChFeHByZXNzaW9uIGVsZW1lbnQpDQotCXsNCi0JCUFTVE5vZGUgY3UgPSBlbGVtZW50Ow0KLQkJd2hpbGUgKGN1ICE9IG51bGwgJiYgIShjdSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkpDQotCQl7DQotCQkJY3UgPSBjdS5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KSBjdTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVR5cGUoSUNvbXBpbGF0aW9uVW5pdCBpY3UsIFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIGxvY2FsRnVsbHlRdWFsaWZpZWROYW1lID0gZnVsbHlRdWFsaWZpZWROYW1lOw0KLQkJSVR5cGVbXSBhbGxUeXBlcyA9IGljdS5nZXRBbGxUeXBlcygpOw0KLQkJaWYgKGFsbFR5cGVzID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGxvY2FsRnVsbHlRdWFsaWZpZWROYW1lOw0KLQkJfQ0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxUeXBlcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlTdHJpbmdbXVtdIHJlc29sdmVkVHlwZSA9IGFsbFR5cGVzW2ldLnJlc29sdmVUeXBlKGxvY2FsRnVsbHlRdWFsaWZpZWROYW1lKTsNCi0JCQlpZiAocmVzb2x2ZWRUeXBlICE9IG51bGwgJiYgcmVzb2x2ZWRUeXBlLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc29sdmVkVHlwZVswXS5sZW5ndGg7IGorKykNCi0JCQkJew0KLQkJCQkJYnVmID0gYXBwZW5kRG90KGosIGJ1Zik7DQotCQkJCQlidWYuYXBwZW5kKHJlc29sdmVkVHlwZVswXVtqXSk7DQotCQkJCX0NCi0JCQkJbG9jYWxGdWxseVF1YWxpZmllZE5hbWUgPSBidWYudG9TdHJpbmcoKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGxvY2FsRnVsbHlRdWFsaWZpZWROYW1lOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBhcHBlbmREb3QoaW50IGluZGV4LCBTdHJpbmdCdWZmZXIgYnVmZikNCi0Jew0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IGJ1ZmY7DQotCQlpZiAoaW5kZXggIT0gMCkNCi0JCXsNCi0JCQlyZXN1bHQuYXBwZW5kKCcuJyk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IElBbm5vdGF0aW9uPFQ+IGdldFNwZWNpZmljQW5ub3RhdGlvbkZyb21NZW1iZXIoZmluYWwgVCB0eXBlLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lLCBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvblFOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWlmICghaXNTdXBwb3J0ZWRKYXZhRWxlbWVudCh0eXBlKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXNzZWQgYXJndW1lbnQgaXMgbm90IG9mIGNvcnJlY3QgdHlwZS4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gbnVsbDsNCi0JCWlmICh0eXBlIGluc3RhbmNlb2YgSU1lbWJlcikgew0KLQkJCWNVbml0ID0gKChJTWVtYmVyKXR5cGUpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJY1VuaXQgPSAoKElUeXBlUGFyYW1ldGVyKXR5cGUpLmdldERlY2xhcmluZ01lbWJlcigpLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJfQ0KLQkJDQotCQlpZiAoY1VuaXQgPT0gbnVsbCkgew0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQ0KLQkJZmluYWwgQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCWZpbmFsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkNCi0JCXN3aXRjaCh0eXBlLmdldEVsZW1lbnRUeXBlKCkpDQotCQl7DQotCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOg0KLQkJCXJldHVybiBnZXRTcGVjaWZpY0Fubm90YXRpb24odHlwZSwgdHlwZURlY2xhcmF0aW9uLCAoSVR5cGUpdHlwZSwgYW5ub3RhdGlvblFOYW1lKTsNCi0JCQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuRklFTEQ6DQotCQkJSUZpZWxkIGZpZWxkID0gKElGaWVsZCkgdHlwZTsNCi0JCQlGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldEZpZWxkRGVjbGFyYXRpb24oZmllbGQsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKHR5cGUsIGZpZWxkRGVjbGFyYXRpb24sIGZpZWxkLmdldERlY2xhcmluZ1R5cGUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0NCi0JCWNhc2UgSUphdmFFbGVtZW50Lk1FVEhPRDoNCi0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSB0eXBlOw0KLQkJCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pdHlwZURlY2xhcmF0aW9uKTsNCi0JCQlyZXR1cm4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKHR5cGUsIG1ldGhvZERlY2xhcmF0aW9uLCBtZXRob2QuZ2V0RGVjbGFyaW5nVHlwZSgpLCBhbm5vdGF0aW9uUU5hbWUpOw0KLQ0KLQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI6DQotCQkJbWV0aG9kID0gKElNZXRob2QpKChJVHlwZVBhcmFtZXRlcikgdHlwZSkuZ2V0UGFyZW50KCk7DQotCQkJbWV0aG9kRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZERlY2xhcmF0aW9uKG1ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbil0eXBlRGVjbGFyYXRpb24pOw0KLQkJCXJldHVybiBnZXRTcGVjaWZpY1BhcmFtQW5ub3RhdGlvbih0eXBlLCBtZXRob2REZWNsYXJhdGlvbiwgbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgYW5ub3RhdGlvblFOYW1lKTsNCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gZ2V0U3BlY2lmaWNBbm5vdGF0aW9uKGZpbmFsIFQgaU1lbWJlciwgZmluYWwgQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiwgZmluYWwgSVR5cGUgdHlwZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAoYm9keURlY2xhcmF0aW9uICE9IG51bGwpDQotCQl7DQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCQkJZmluYWwgTGlzdCBsaXN0ID0gYm9keURlY2xhcmF0aW9uLm1vZGlmaWVycygpOw0KLQkJCXJldHVybiBleHRyYWN0U3BlY2lmaWNBbm5vdGF0aW9uKGlNZW1iZXIsIGxpc3QsIHR5cGUsIGFubm90YXRpb25RTmFtZSk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSA8VCBleHRlbmRzIElKYXZhRWxlbWVudD4gSUFubm90YXRpb248VD4gZ2V0U3BlY2lmaWNQYXJhbUFubm90YXRpb24oVCBpTWVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiwgZmluYWwgSVR5cGUgdHlwZSwgZmluYWwgU3RyaW5nIGFubm90YXRpb25RTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAobWV0aG9kRGVjbGFyYXRpb24gIT0gbnVsbCkNCi0JCXsNCi0JCQlmb3IgKE9iamVjdCBwYXJhbSA6IG1ldGhvZERlY2xhcmF0aW9uLnBhcmFtZXRlcnMoKSkNCi0JCQl7DQotCQkJCWlmIChwYXJhbSBpbnN0YW5jZW9mIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gJiYNCi0JCQkJCQkoKElUeXBlUGFyYW1ldGVyKWlNZW1iZXIpLmdldEVsZW1lbnROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKXBhcmFtKS5nZXROYW1lKCkudG9TdHJpbmcoKSkpDQotCQkJCXsNCi0JCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQkJCQkJZmluYWwgTGlzdCBsaXN0ID0gKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBwYXJhbSkubW9kaWZpZXJzKCk7DQotCQkJCQ0KLQkJCQkJcmV0dXJuIGV4dHJhY3RTcGVjaWZpY0Fubm90YXRpb24oaU1lbWJlciwgbGlzdCwgdHlwZSwgYW5ub3RhdGlvblFOYW1lKTsNCi0JCQkJfQ0KLQkJCX0JCQkNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9CQ0KLQkNCi0JcHJpdmF0ZSBib29sZWFuIGlzU3VwcG9ydGVkSmF2YUVsZW1lbnQoZmluYWwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSANCi0Jew0KLQkJcmV0dXJuIAlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuTUVUSE9EIHx8DQotCQkJCWphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk9PUlKYXZhRWxlbWVudC5UWVBFIHx8DQotCQkJCWphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCk9PUlKYXZhRWxlbWVudC5GSUVMRCB8fA0KLQkJCQlqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpPT1JSmF2YUVsZW1lbnQuVFlQRV9QQVJBTUVURVI7DQotCX0NCi0JDQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIA0KLQl7DQotCQlpZiAoY1VuaXQ9PW51bGwpIHsNCi0JCQljVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGlUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNVbml0Ow0KLQl9DQotCQ0KLQlwcml2YXRlIElMb2NhdG9yIGNyZWF0ZUxvY2F0b3IoZmluYWwgQVNUTm9kZSBub2RlKQ0KLQl7DQotCQlmaW5hbCBpbnQgbGluZU51bWJlciA9IGdldENvbXBpbGF0aW9uVW5pdCgpLmdldExpbmVOdW1iZXIobm9kZS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJcmV0dXJuIG5ldyBMb2NhdG9ySW1wbChsaW5lTnVtYmVyLCBub2RlLmdldFN0YXJ0UG9zaXRpb24oKSwgbm9kZS5nZXRMZW5ndGgoKSk7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYzE3YmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvblByb3BlcnR5Ow0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uUHJvcGVydHkgaW1wbGVtZW50cyBJQW5ub3RhdGlvblByb3BlcnR5DQotew0KLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uTmFtZTsNCi0JcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlTmFtZTsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotCXByaXZhdGUgQXR0cmlidXRlVHlwZUVudW0gYXR0cmlidXRlVHlwZTsNCi0JDQotCS8qKg0KLQkgKiBQdWJsaWMgY29uc3RydWN0b3IgZm9yIEFubm90YXRpb25Qcm9wZXJ0eSBvYmplY3RzDQotCSAqIA0KLQkgKiBAcGFyYW0gYW5ub3RhdGlvbk5hbWUgLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIE5hbWUgZm9yIHRoZSBBbm5vdGF0aW9uLg0KLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSAtIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTmFtZSBmb3IgdGhlIEF0dHJpYnV0ZS4NCi0JICogQHBhcmFtIHZhbHVlIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBWYWx1ZSBmb3IgdGhlIEF0dHJpYnV0ZS4NCi0JICovDQotCXB1YmxpYyBBbm5vdGF0aW9uUHJvcGVydHkoZmluYWwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlLCBmaW5hbCBBdHRyaWJ1dGVUeXBlRW51bSBhdHRyaWJ1dGVUeXBlKQ0KLQl7DQotCQl0aGlzLmFubm90YXRpb25OYW1lID0gYW5ub3RhdGlvbk5hbWU7DQotCQl0aGlzLmF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGVOYW1lOw0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQkJdGhpcy5hdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsNCi0JfQ0KLQkJDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uTmFtZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMudmFsdWU7DQotCX0NCi0JDQotCXB1YmxpYyBBdHRyaWJ1dGVUeXBlRW51bSBnZXRBdHRyaWJ1dGVUeXBlKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViMDE4Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5NYXA7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXINCi17DQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IHR5cGVBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IA0KLQkJbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4oKTsNCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXQ8SVBhcmFtVmFsdWVQYWlyPj4gbWV0aG9kQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSANCi0JCW5ldyBIYXNoTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+KCk7DQotCXByaXZhdGUgTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IHBhcmFtZXRlckFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gDQotCQluZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PigpOw0KLQkNCi0JLyoqDQotCSAqIEFkZCBBbm5vdGF0aW9uIFByb3BlcnR5IHRvIHRoZSBjb250YWluZXIuIA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBvciA8Y29kZT5hbm5vdGF0aW9uUHJvcGVydHk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQW5ub3RhdGlvblByb3BlcnR5KGZpbmFsIEFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHksIGZpbmFsIEVsZW1lbnRUeXBlIHRhcmdldCkNCi0Jew0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJhbm5vdGF0aW9uUHJvcGVydHkgY291bGQgbm90IGJlIG51bGwhIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKHRhcmdldCA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGFyZ2V0IGNvdWxkIG5vdCBiZSBudWxsISIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlpZighKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5NRVRIT0QpKSAmJiAhKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGFyZ2V0IHBhcmFtZXRlciBpcyBub3Qgb2YgY29ycmVjdCB0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCU1hcDxTdHJpbmcsIFNldDxJUGFyYW1WYWx1ZVBhaXI+PiBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IG51bGw7DQotCQkNCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSB0eXBlQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLk1FVEhPRCkpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBtZXRob2RBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IHBhcmFtZXRlckFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJDQotCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzU2V0ID0gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAuZ2V0KGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBbm5vdGF0aW9uTmFtZSgpKTsNCi0JCWlmKHBhcmFtVmFsdWVzU2V0ID09IG51bGwpDQotCQl7DQotCQkJcGFyYW1WYWx1ZXNTZXQgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAucHV0KGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBbm5vdGF0aW9uTmFtZSgpLCBwYXJhbVZhbHVlc1NldCk7DQotCQl9DQotDQotCQlJVmFsdWUgdmFsdWUgPSBudWxsOyANCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkgPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCWlmKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQm9vbGVhblZhbHVlKG5ldyBCb29sZWFuKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKSk7DQotCQl9DQotCQlpZihhbm5vdGF0aW9uUHJvcGVydHkuZ2V0QXR0cmlidXRlVHlwZSgpLmVxdWFscyhBdHRyaWJ1dGVUeXBlRW51bS5DTEFTUykpDQotCQl7DQotCQkJLy9UT0RPIGNoYW5nZSB0aGlzISEhISEhDQotCQkJLy92YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUNsYXNzVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUikpDQotCQl7DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVJbnRlZ2VyVmFsdWUoYW5ub3RhdGlvblByb3BlcnR5LmdldFZhbHVlKCkpOw0KLQkJfQ0KLQkJaWYoYW5ub3RhdGlvblByb3BlcnR5LmdldEF0dHJpYnV0ZVR5cGUoKS5lcXVhbHMoQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpKQ0KLQkJew0KLQkJCXZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRWYWx1ZSgpKTsNCi0JCX0NCi0JCWlmKHZhbHVlID09IG51bGwpDQotCQl7DQotCQkJdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZShhbm5vdGF0aW9uUHJvcGVydHkuZ2V0VmFsdWUoKSk7DQotCQl9DQotDQotCQlJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKGFubm90YXRpb25Qcm9wZXJ0eS5nZXRBdHRyaWJ1dGVOYW1lKCksIHZhbHVlKTsNCi0JCQ0KLQkJcGFyYW1WYWx1ZXNTZXQuYWRkKHBhcmFtVmFsdWVQYWlyKTsNCi0JfQ0KLQkvKioNCi0JICogQHBhcmFtIElUeXBlUGFyYW1ldGVyIA0KLQkgKiBAcmV0dXJuIFNldCB3aXRoIGFsbCBBbm5vdGF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciwgd2hpY2ggYXJlIElUeXBlUGFyYW1ldGVyIHJlbGV2YW50Lg0KLQkgKi8NCi0JcHVibGljIFNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IGdldFBhcmFtZXRlckFubm90YXRpb25zKElUeXBlUGFyYW1ldGVyIHRQYXJhbSkNCi0Jew0KLQkJcmV0dXJuIGdldEFubm90YXRpb25zKEVsZW1lbnRUeXBlLlBBUkFNRVRFUiwgdFBhcmFtKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBTZXQgd2l0aCBhbGwgQW5ub3RhdGlvbiBmcm9tIHRoZSBjb250YWluZXIsIHdoaWNoIGFyZSBJVHlwZSByZWxldmFudC4NCi0JICovDQotCXB1YmxpYyBTZXQ8SUFubm90YXRpb248SVR5cGU+PiBnZXRUeXBlQW5ub3RhdGlvbnMoSVR5cGUgdHlwZSkNCi0Jew0KLQkJcmV0dXJuIGdldEFubm90YXRpb25zKEVsZW1lbnRUeXBlLlRZUEUsIHR5cGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAcmV0dXJuIFNldCB3aXRoIGFsbCBBbm5vdGF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciwgd2hpY2ggYXJlIElNZXRob2QgcmVsZXZhbnQuDQotCSAqLw0KLQlwdWJsaWMgU2V0PElBbm5vdGF0aW9uPElNZXRob2Q+PiBnZXRNZXRob2RBbm5vdGF0aW9ucyhJTWV0aG9kIG1ldGhvZCkNCi0Jew0KLQkJcmV0dXJuIGdldEFubm90YXRpb25zKEVsZW1lbnRUeXBlLk1FVEhPRCAsIG1ldGhvZCk7DQotCX0NCi0JDQotCXByaXZhdGUgPFQgZXh0ZW5kcyBJSmF2YUVsZW1lbnQ+IFNldDxJQW5ub3RhdGlvbjxUPj4gZ2V0QW5ub3RhdGlvbnMoZmluYWwgRWxlbWVudFR5cGUgdGFyZ2V0LCBmaW5hbCBUIGlUYXJnZXQpDQotCXsNCi0JCWlmKCEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5UWVBFKSkgJiYgISh0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLk1FVEhPRCkpICYmICEodGFyZ2V0LmVxdWFscyhFbGVtZW50VHlwZS5QQVJBTUVURVIpKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0YXJnZXQgcGFyYW1ldGVyIGlzIG5vdCBvZiBjb3JyZWN0IHR5cGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJTWFwPFN0cmluZywgU2V0PElQYXJhbVZhbHVlUGFpcj4+IGFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwID0gbnVsbDsNCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuVFlQRSkpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSB0eXBlQW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXA7DQotCQl9DQotCQlpZih0YXJnZXQuZXF1YWxzKEVsZW1lbnRUeXBlLk1FVEhPRCkpDQotCQl7DQotCQkJYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAgPSBtZXRob2RBbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcDsNCi0JCX0NCi0JCWlmKHRhcmdldC5lcXVhbHMoRWxlbWVudFR5cGUuUEFSQU1FVEVSKSkNCi0JCXsNCi0JCQlhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcCA9IHBhcmFtZXRlckFubm90YXRpb25OYW1lMlBhcmFtVmFsdWVzTWFwOw0KLQkJfQ0KLQkJU2V0PElBbm5vdGF0aW9uPFQ+PiByZXN1bHQgPSBuZXcgSGFzaFNldDxJQW5ub3RhdGlvbjxUPj4oKTsNCi0JCVNldDxTdHJpbmc+IGtleXMgPSBhbm5vdGF0aW9uTmFtZTJQYXJhbVZhbHVlc01hcC5rZXlTZXQoKTsNCi0JCWZvciAoU3RyaW5nIGtleSA6IGtleXMpDQotCQl7DQotCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZVBhaXJzU2V0ID0gYW5ub3RhdGlvbk5hbWUyUGFyYW1WYWx1ZXNNYXAuZ2V0KGtleSk7DQotCQkJSUFubm90YXRpb248VD4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oa2V5LCBwYXJhbVZhbHVlUGFpcnNTZXQsIGlUYXJnZXQpOw0KLQkJCXJlc3VsdC5hZGQoYW5ub3RhdGlvbik7DQotCQl9DQotCQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0JDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Bbm5vdGF0aW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzg1NWExYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQW5ub3RhdGlvblV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247DQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmNsYXp6LkFTVFV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwudGV4dC5KYXhXc1V0aWxNZXNzYWdlczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5FZGl0UmVzb3VyY2VzTWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5GaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuSUZpbGVVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0Ow0KLQ0KLS8qKg0KLSAqIENvbnRhaW5zIHV0aWxpdGllcyBmb3IgZ2V0dGluZyBBU1Qgb2JqZWN0cyBuZWVkZWQgaW4gYW5ub3RhdGlvbiBwcm9jZXNzaW5nDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIEFubm90YXRpb25VdGlscw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvblV0aWxzIHV0aWxzID0gbnVsbDsNCi0JcHJpdmF0ZSBmaW5hbCBJRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRJbnN0YW5jZSgpOw0KLQ0KLQkvKioNCi0JICogVGhlIGZhY3RvcnkgbWV0aG9kLg0KLQkgKiANCi0JICogQHJldHVybiBhIEFubm90YXRpb25VdGlscyBpbnN0YW5jZS4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblV0aWxzIGdldEluc3RhbmNlKCkNCi0Jew0KLQkJaWYgKHV0aWxzID09IG51bGwpDQotCQl7DQotCQkJdXRpbHMgPSBuZXcgQW5ub3RhdGlvblV0aWxzKCk7DQotCQl9DQotCQlyZXR1cm4gdXRpbHM7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBHZXRzIElEb2N1bWVudCwgd2hpY2ggY29yZXNwb25kcyB0byBvbmUgQ29tcGlsYXRpb25Vbml0Lg0KLQkgKiANCi0JICogQHBhcmFtIHVuaXQgLQ0KLQkgKiAgICAgICAgICAgIENvbXBpbGF0aW9uIFVuaXQsIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzdGFydGluZyBwb2ludCB0byBnZXQgdGhlIElEb2N1bWVudC4NCi0JICogDQotCSAqIEByZXR1cm4gSURvY3VtZW50IHdoaWNoIGlzIGZvdW5kLg0KLQkgKiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KElDb21waWxhdGlvblVuaXQgdW5pdCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHNvdXJjZSA9IHVuaXQuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKTsgDQotCQlyZXR1cm4gbmV3IERvY3VtZW50KHNvdXJjZSk7IA0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVtb3ZlcyBBbm5vdGF0aW9ucyBvZiBzcGVjaWZpZWQgSUphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50IC0gSUphdmFFbGVtZW50IHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzdGFydGluZyBwb2luIGZvciByZW1vdmluZyB0aGUgYW5ub3RhdGlvbnMuDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9ucyAtIFNldCB3aGljaCBjb250YWlucyBTdHJpbmcgdmFsdWVzIGZvciB0aGUgYW5ub3RhdGlvbnMgd2hpY2ggd2lsbCBiZSByZW1vdmVkLiBJZiB0aGlzIFNldCBpcyBlbXB0eSBhbGwgQW5ub3RhdGlvbnMgd2lsbCBiZSByZW1vdmVkLg0KLQkgKiBAcGFyYW0gZGVlcFJlbW92ZSAtIEJvb2xlYW4gdmFsdWUsIHJlcHJlc2VudGluZyB3aGV0aGVyIEFubm90YXRpb25zIGZyb20gamF2YUVsZW1ldCBjaGlsZHMgd2lsbCBiZSByZW1vdmVkLiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uIA0KLQkgKiANCi0JICogQHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHRob3duIGlmIEFTVCBUeXBlRGVjbGFyYXRpb24gY2Fubm90IGJlIGZvdW5kIGZvciA8Y29kZT50eXBlPC9jb2RlPiBhbmQgYWxzbyBpcyB1c2VkIGFzIHdyYXBwZXIgaW4gY2FzZSB7QGxpbmsgQ29yZUV4Y2VwdGlvbn0gb3INCi0JICogICAgICAgICAgICAge0BsaW5rIEJhZExvY2F0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gd2hpbGUgcHJvY2Vzc2luZy4NCi0JICogQHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiANCi0JICogQHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbnMoSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucywgYm9vbGVhbiBkZWVwUmVtb3ZlKSB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbg0KLQl7DQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKQ0KLQkJew0KLQkJCUlUeXBlIHR5cGUgPSAoSVR5cGUpamF2YUVsZW1lbnQ7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCQlDb21waWxhdGlvblVuaXQgdW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGNVbml0LCBudWxsKTsNCi0NCi0JCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmdldFR5cGVEZWNsYXJhdGlvbihjbGFzc05hbWUsIHVuaXQpOw0KLQkJCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uKCJ0eXBlRGVjbGFyYXRpb24gc2hvdWxkIG5vdCBiZSBudWxsIiwvLyROT04tTkxTLTEkDQotCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpheFdzVXRpbE1lc3NhZ2VzLkFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZywgInR5cGVEZWNsYXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQkNCi0JCQlyZW1vdmVUeXBlQW5ub3RhdGlvbnModHlwZSwgdHlwZURlY2xhcmF0aW9uLCB1bml0LCBjVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQ0KLQkJCWlmKCFkZWVwUmVtb3ZlKQ0KLQkJCXsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCQkNCi0JCQlJRmllbGRbXSB0bXBGaWVsZHMgPSB0eXBlLmdldEZpZWxkcygpOw0KLQkJCWlmICh0bXBGaWVsZHMgIT0gbnVsbCAmJiB0bXBGaWVsZHMubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCWZvciAoSUZpZWxkIHRtcEZpZWxkIDogdG1wRmllbGRzKQ0KLQkJCQl7DQotCQkJCQlyZW1vdmVGaWVsZEFubm90YXRpb25zKHRtcEZpZWxkLCB0eXBlLCBjVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCQ0KLQkJCUlNZXRob2RbXSB0bXBNZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7DQotCQkJaWYgKHRtcE1ldGhvZHMgIT0gbnVsbCAmJiB0bXBNZXRob2RzLmxlbmd0aCA+IDApDQotCQkJew0KLQkJCQlmb3IgKElNZXRob2QgdG1wTWV0aG9kIDogdG1wTWV0aG9kcykNCi0JCQkJew0KLQkJCQkJcmVtb3ZlTWV0aG9kQW5ub3RhdGlvbnModG1wTWV0aG9kLCB0eXBlLCBjVW5pdCwgYW5ub3RhdGlvbnMpOw0KLQ0KLQkJCQkJLy9SZW1vdmUgcGFyYW1zIGFubm90YXRpb25zDQotCQkJCQlmb3IgKFN0cmluZyBwYXJhbU5hbWUgOiB0bXBNZXRob2QuZ2V0UGFyYW1ldGVyTmFtZXMoKSkNCi0JCQkJCXsNCi0JCQkJCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gdG1wTWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIocGFyYW1OYW1lKTsNCi0JCQkJCQlyZW1vdmVQYXJhbUFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIsIHR5cGUsIGNVbml0LCBhbm5vdGF0aW9ucywgcGFyYW1OYW1lKTsJCQkNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpDQotCQl7DQotCQkJSUZpZWxkIGZpZWxkID0gKElGaWVsZClqYXZhRWxlbWVudDsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVGaWVsZEFubm90YXRpb25zKGZpZWxkLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25zKTsNCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJTWV0aG9kKQ0KLQkJew0KLQkJCUlNZXRob2QgbWV0aG9kID0gKElNZXRob2QpamF2YUVsZW1lbnQ7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IG1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJCQ0KLQkJCXJlbW92ZU1ldGhvZEFubm90YXRpb25zKG1ldGhvZCwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucyk7DQotCQkJaWYoIWRlZXBSZW1vdmUpDQotCQkJew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQ0KLQkJCS8vUmVtb3ZlIHBhcmFtcyBhbm5vdGF0aW9ucw0KLQkJCWZvciAoU3RyaW5nIHBhcmFtTmFtZTogbWV0aG9kLmdldFBhcmFtZXRlck5hbWVzKCkpDQotCQkJew0KLQkJCSAgSVR5cGVQYXJhbWV0ZXIgcGFyYW0gPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcihwYXJhbU5hbWUpOw0KLQkJCSAgcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyhwYXJhbSwgZGVjbGFyaW5nVHlwZSwgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBhbm5vdGF0aW9ucywgcGFyYW1OYW1lKTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGVQYXJhbWV0ZXIpDQotCQl7DQotCQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IChJVHlwZVBhcmFtZXRlcilqYXZhRWxlbWVudDsNCi0JCQlJTWV0aG9kIHRtcE1ldGhvZCA9IChJTWV0aG9kKSB0eXBlUGFyYW1ldGVyLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJCS8vVE9ETyBjaGVjayB0aGlzDQotCQkJLy9wYXJhbS5nZXRQYXJlbnQoKTsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gdG1wTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJLy9UT0RPIEZJWCBUSElTDQotCQkJcmVtb3ZlUGFyYW1Bbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25zLCBudWxsKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVR5cGVBbm5vdGF0aW9ucyhJVHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sIENvbXBpbGF0aW9uVW5pdCB1bml0LCBJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbnModHlwZURlY2xhcmF0aW9uLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQl7DQotCQkJSURvY3VtZW50IGRvYyA9IEFubm90YXRpb25VdGlscy5nZXRJbnN0YW5jZSgpLmdldERvY3VtZW50KGNVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gdW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGNVbml0LCBkb2MpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZEFubm90YXRpb25zKElGaWVsZCBmaWVsZCwgSVR5cGUgZGVjbGFyaW5nVHlwZSwgSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIFNldDxTdHJpbmc+IGFubm90YXRpb25zU2V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJQ29tcGlsYXRpb25Vbml0IGZjVW5pdCA9IGZpZWxkLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBmVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZjVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgZlVuaXQpOw0KLQkJZkJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RmllbGREZWNsYXJhdGlvbihmaWVsZCwgKFR5cGVEZWNsYXJhdGlvbikgZkJvZHlEZWNsYXJhdGlvbik7DQotDQotCQlmVW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbnMoZkJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbnNTZXQpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSBmVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0aG9kQW5ub3RhdGlvbnMoSU1ldGhvZCBtZXRob2QsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSUNvbXBpbGF0aW9uVW5pdCBtY1VuaXQgPSBtZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IG1Vbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQobWNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBtQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBtVW5pdCk7DQotCQltQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbihtZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pOw0KLQkJbVVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQkJaWYgKHJlbW92ZUFubm90YXRpb25zKG1Cb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25zU2V0KSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gbVVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVBhcmFtQW5ub3RhdGlvbnMoSVR5cGVQYXJhbWV0ZXIgcGFyYW0sIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9uc1NldCwgU3RyaW5nIHBhcmFtTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZClwYXJhbS5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCS8vVE9ETyBjaGVjayB0aGlzDQotCQkvL3BhcmFtLmdldFBhcmVudCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gdG1wTWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IG1Vbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQobWNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBtQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBtVW5pdCk7DQotCQltQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRNZXRob2REZWNsYXJhdGlvbih0bXBNZXRob2QsIChUeXBlRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pOw0KLQkJbVVuaXQucmVjb3JkTW9kaWZpY2F0aW9ucygpOw0KLQ0KLQkJZm9yIChPYmplY3Qgb2JqZWN0IDogKChNZXRob2REZWNsYXJhdGlvbikgbUJvZHlEZWNsYXJhdGlvbikucGFyYW1ldGVycygpKQ0KLQkJew0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKQ0KLQkJCXsNCi0JCQkgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gc3ZkID0gKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24pIG9iamVjdDsNCi0JCQkJaWYgKChwYXJhbU5hbWUgPT0gbnVsbCB8fCBzdmQuZ2V0TmFtZSgpLnRvU3RyaW5nKCkuZXF1YWxzKHBhcmFtTmFtZSkpICYmDQotCQkJCSAgICAgICAgcmVtb3ZlQW5ub3RhdGlvbnMoc3ZkLm1vZGlmaWVycygpLCBhbm5vdGF0aW9uc1NldCkpDQotCQkJCXsNCi0JCQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCQkJVGV4dEVkaXQgZWRpdCA9IG1Vbml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0JCQkJCQ0KLQkJCQkJc2F2ZUNvbnRlbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBkb2MpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgc2F2ZUNvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwgSURvY3VtZW50IGRvYykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlTdGF0dXMgc3RhdHVzID0gKG5ldyBFZGl0UmVzb3VyY2VzTWFuYWdlcigpKS5zZXRGaWxlRWRpdGFibGUoKElGaWxlKSBjVW5pdC5nZXRSZXNvdXJjZSgpKTsNCi0JCWlmKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuT0sgKQ0KLQkJew0KLQkJCWZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhjVW5pdCwgZG9jLmdldCgpLCB0cnVlLCBudWxsKTsNCi0JCX0NCi0JCWVsc2UNCi0JCXsNCi0JCQl0aHJvdyBuZXcgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbigiQW5ub3RhdHRpb24gY291bGQgbm90IGJlIHN0b3JlZCwgdGhlIGZpbGUgaXMgbm90IHdyaXRhYmxlIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCQkJSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvbkNhbm5vdEJlU3RvcmVkTXNnKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJlbW92ZXMgc3BlY2lmaWMgQW5ub3RhdGlvbiBvZiBzcGVjaWZpZWQgSUphdmFFbGVtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGphdmFFbGVtZW50IC0gSUphdmFFbGVtZW50IHdoaWNoIHdpbGwgYmUgdXNlZCBhcyBzdGFydGluZyBwb2luIGZvciByZW1vdmluZyB0aGUgQW5ub3RhdGlvbi4NCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lIC0gU3RyaW5nIHdoaWNoIGlzIHRoZSByZXByZXNlbnRhdGlvbiBOYW1lIG9mIHRoZSBBbm5vdGF0aW9uLCB3aGljaCB3aWxsIGJlIHJlbW92ZWQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB0aG93biBpZiBBU1QgVHlwZURlY2xhcmF0aW9uIGNhbm5vdCBiZSBmb3VuZCBmb3IgPGNvZGU+dHlwZTwvY29kZT4gYW5kIGFsc28gaXMgdXNlZCBhcyB3cmFwcGVyIGluIGNhc2Uge0BsaW5rIENvcmVFeGNlcHRpb259IG9yDQotCSAqICAgICAgICAgICAgIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gaXMgdGhyb3duIHdoaWxlIHByb2Nlc3NpbmcuDQotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uDQotCXsNCi0JCWlmKGphdmFFbGVtZW50IGluc3RhbmNlb2YgSVR5cGUpDQotCQl7DQotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSlqYXZhRWxlbWVudDsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0ID0gdHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoY1VuaXQsIG51bGwpOw0KLQ0KLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgdW5pdCk7DQotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24oInR5cGVEZWNsYXJhdGlvbiBzaG91bGQgbm90IGJlIG51bGwiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnLCAidHlwZURlY2xhcmF0aW9uIikpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCQ0KLQkJCXJlbW92ZVR5cGVBbm5vdGF0aW9uKHR5cGUsIHR5cGVEZWNsYXJhdGlvbiwgdW5pdCwgY1VuaXQsIGFubm90YXRpb25OYW1lKTsNCi0NCi0JCX0NCi0JCQ0KLQkJaWYoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJRmllbGQpDQotCQl7DQotCQkJSUZpZWxkIGZpZWxkID0gKElGaWVsZClqYXZhRWxlbWVudDsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gZmllbGQuZ2V0RGVjbGFyaW5nVHlwZSgpOw0KLQkJCUlDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0ID0gZGVjbGFyaW5nVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKTsNCi0JCQkNCi0JCQlyZW1vdmVGaWVsZEFubm90YXRpb24oZmllbGQsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbk5hbWUpOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElNZXRob2QpDQotCQl7DQotCQkJSU1ldGhvZCBtZXRob2QgPSAoSU1ldGhvZClqYXZhRWxlbWVudDsNCi0JCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gbWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKTsNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCA9IGRlY2xhcmluZ1R5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQkJDQotCQkJcmVtb3ZlTWV0aG9kQW5ub3RhdGlvbihtZXRob2QsIGRlY2xhcmluZ1R5cGUsIGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgYW5ub3RhdGlvbk5hbWUpOw0KLQkJfQ0KLQkJDQotCQlpZihqYXZhRWxlbWVudCBpbnN0YW5jZW9mIElUeXBlUGFyYW1ldGVyKQ0KLQkJew0KLQkJCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSAoSVR5cGVQYXJhbWV0ZXIpamF2YUVsZW1lbnQ7DQotCQkJSU1ldGhvZCB0bXBNZXRob2QgPSAoSU1ldGhvZCkgdHlwZVBhcmFtZXRlci5nZXREZWNsYXJpbmdNZW1iZXIoKTsNCi0JCQkvL1RPRE8gY2hlY2sgdGhpcw0KLQkJCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRtcE1ldGhvZC5nZXREZWNsYXJpbmdUeXBlKCk7DQotCQkJSUNvbXBpbGF0aW9uVW5pdCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQgPSBkZWNsYXJpbmdUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQ0KLQkJCXJlbW92ZVBhcmFtQW5ub3RhdGlvbih0eXBlUGFyYW1ldGVyLCBkZWNsYXJpbmdUeXBlLCBkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGFubm90YXRpb25OYW1lKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVR5cGVBbm5vdGF0aW9uKElUeXBlIHR5cGUsIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgQ29tcGlsYXRpb25Vbml0IHVuaXQsIElDb21waWxhdGlvblVuaXQgY1VuaXQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJdW5pdC5yZWNvcmRNb2RpZmljYXRpb25zKCk7DQotCQlpZiAocmVtb3ZlQW5ub3RhdGlvbih0eXBlRGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gQW5ub3RhdGlvblV0aWxzLmdldEluc3RhbmNlKCkuZ2V0RG9jdW1lbnQoY1VuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSB1bml0LnJld3JpdGUoZG9jLCBudWxsKTsNCi0JCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJc2F2ZUNvbnRlbnQoY1VuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZpZWxkQW5ub3RhdGlvbihJRmllbGQgZmllbGQsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgZmNVbml0ID0gZmllbGQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJQ29tcGlsYXRpb25Vbml0IGZVbml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoZmNVbml0LCBudWxsKTsNCi0NCi0JCUJvZHlEZWNsYXJhdGlvbiBmQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oY2xhc3NOYW1lLCBmVW5pdCk7DQotCQlmQm9keURlY2xhcmF0aW9uID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRGaWVsZERlY2xhcmF0aW9uKGZpZWxkLCAoVHlwZURlY2xhcmF0aW9uKSBmQm9keURlY2xhcmF0aW9uKTsNCi0NCi0JCWZVbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmIChyZW1vdmVBbm5vdGF0aW9uKGZCb2R5RGVjbGFyYXRpb24ubW9kaWZpZXJzKCksIGFubm90YXRpb25OYW1lKSkNCi0JCXsNCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQlUZXh0RWRpdCBlZGl0ID0gZlVuaXQucmV3cml0ZShkb2MsIG51bGwpOw0KLQkJCWVkaXQuYXBwbHkoZG9jKTsNCi0NCi0JCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1ldGhvZEFubm90YXRpb24oSU1ldGhvZCBtZXRob2QsIElUeXBlIGRlY2xhcmluZ1R5cGUsIElDb21waWxhdGlvblVuaXQgZGVjbGFyaW5nVHlwZUNvbXBVbml0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCUlDb21waWxhdGlvblVuaXQgbWNVbml0ID0gbWV0aG9kLmdldENvbXBpbGF0aW9uVW5pdCgpOw0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGRlY2xhcmluZ1R5cGUuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24obWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWlmKHJlbW92ZUFubm90YXRpb24obUJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbk5hbWUpKQ0KLQkJew0KLQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQpOw0KLQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJZWRpdC5hcHBseShkb2MpOw0KLQ0KLQkJCXNhdmVDb250ZW50KGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgZG9jKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUGFyYW1Bbm5vdGF0aW9uKElUeXBlUGFyYW1ldGVyIHBhcmFtLCBJVHlwZSBkZWNsYXJpbmdUeXBlLCBJQ29tcGlsYXRpb25Vbml0IGRlY2xhcmluZ1R5cGVDb21wVW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJTWV0aG9kIHRtcE1ldGhvZCA9IChJTWV0aG9kKXBhcmFtLmdldERlY2xhcmluZ01lbWJlcigpOw0KLQkJLy9UT0RPIGNoZWNrIHRoaXMNCi0JCS8vcGFyYW0uZ2V0UGFyZW50KCk7DQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpOw0KLQkJSUNvbXBpbGF0aW9uVW5pdCBtY1VuaXQgPSB0bXBNZXRob2QuZ2V0Q29tcGlsYXRpb25Vbml0KCk7DQotCQljbGFzc05hbWUgPSB0bXBNZXRob2QuZ2V0UGFyZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCBtVW5pdCA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG1jVW5pdCwgbnVsbCk7DQotDQotCQlCb2R5RGVjbGFyYXRpb24gbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKGNsYXNzTmFtZSwgbVVuaXQpOw0KLQkJbUJvZHlEZWNsYXJhdGlvbiA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0TWV0aG9kRGVjbGFyYXRpb24odG1wTWV0aG9kLCAoVHlwZURlY2xhcmF0aW9uKSBtQm9keURlY2xhcmF0aW9uKTsNCi0NCi0JCW1Vbml0LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsNCi0JCWZvciAoT2JqZWN0IG9iamVjdCA6ICgoTWV0aG9kRGVjbGFyYXRpb24pIG1Cb2R5RGVjbGFyYXRpb24pLnBhcmFtZXRlcnMoKSkNCi0JCXsNCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikNCi0JCQl7DQotCQkJCWlmIChyZW1vdmVBbm5vdGF0aW9uKCgoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbikgb2JqZWN0KS5tb2RpZmllcnMoKSwgYW5ub3RhdGlvbk5hbWUpKQ0KLQkJCQl7DQotCQkJCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZGVjbGFyaW5nVHlwZUNvbXBVbml0KTsNCi0JCQkJCVRleHRFZGl0IGVkaXQgPSBtVW5pdC5yZXdyaXRlKGRvYywgbnVsbCk7DQotCQkJCQllZGl0LmFwcGx5KGRvYyk7DQotDQotCQkJCQlzYXZlQ29udGVudChkZWNsYXJpbmdUeXBlQ29tcFVuaXQsIGRvYyk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgc3BlY2lmaWMgYW5ub3RhdGlvbiBmcm9tIHRoZSBsaXN0IG9mIG1vZGlmaWVycy4NCi0JICogDQotCSAqIEBwYXJhbSBtb2RpZmllcnMNCi0JICogQHBhcmFtIGFubm90YXRpb25OYW1lDQotCSAqIA0KLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUsIHdoaWNoIHJlcHJlc2VudHMgd2hldGVyIHRoZSBhbm5vdGF0aW9uIGlzIHJlbW92ZWQgb3Igbm90Lg0KLQkgKi8NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKExpc3QgbW9kaWZpZXJzLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpDQotCXsNCi0JCUFubm90YXRpb25bXSBtQW5ub3RhdGlvbnMgPSBleHRyYWN0QW5ub3RhdGlvbnMobW9kaWZpZXJzKTsNCi0JCWZvciAoQW5ub3RhdGlvbiBtQW5ub3RhdGlvbiA6IG1Bbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZih2YWxpZGF0ZUFubm90YXRhdGlvbihtQW5ub3RhdGlvbiwgYW5ub3RhdGlvbk5hbWUpKQ0KLQkJCXsNCi0JCQkJbW9kaWZpZXJzLnJlbW92ZShtQW5ub3RhdGlvbik7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlQW5ub3RhdGlvbnMoTGlzdCBtb2RpZmllcnMsIFNldDxTdHJpbmc+IGFubm90YXRpb25zU2V0KQ0KLQl7DQotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsNCi0JCUFubm90YXRpb25bXSBtQW5ub3RhdGlvbnMgPSBleHRyYWN0QW5ub3RhdGlvbnMobW9kaWZpZXJzKTsNCi0JCWZvciAoaW50IG1haSA9IDA7IG1haSA8IG1Bbm5vdGF0aW9ucy5sZW5ndGg7IG1haSsrKQ0KLQkJew0KLQkJCWlmIChhbm5vdGF0aW9uc1NldCAhPSBudWxsKQ0KLQkJCXsNCi0JCQkJaWYgKGFubm90YXRpb25zU2V0LmNvbnRhaW5zKG1Bbm5vdGF0aW9uc1ttYWldLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQltb2RpZmllcnMucmVtb3ZlKG1Bbm5vdGF0aW9uc1ttYWldKTsNCi0JCQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCQl9DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQltb2RpZmllcnMucmVtb3ZlKG1Bbm5vdGF0aW9uc1ttYWldKTsNCi0JCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGNoYW5nZWQ7DQotCX0NCi0NCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQotCXByaXZhdGUgQW5ub3RhdGlvbltdIGV4dHJhY3RBbm5vdGF0aW9ucyhMaXN0IG1vZGlmaWVycykNCi0Jew0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RpZmllcnMuaXRlcmF0b3IoKTsNCi0JCVNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1NldCA9IG5ldyBIYXNoU2V0PEFubm90YXRpb24+KCk7DQotDQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUlFeHRlbmRlZE1vZGlmaWVyIG1vZGlmID0gKElFeHRlbmRlZE1vZGlmaWVyKSBpdGVyYXRvci5uZXh0KCk7DQotCQkJaWYgKG1vZGlmLmlzQW5ub3RhdGlvbigpKQ0KLQkJCXsNCi0JCQkJYW5ub3RhdGlvbnNTZXQuYWRkKChBbm5vdGF0aW9uKSBtb2RpZik7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGFubm90YXRpb25zU2V0LnRvQXJyYXkobmV3IEFubm90YXRpb25bYW5ub3RhdGlvbnNTZXQuc2l6ZSgpXSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlQW5ub3RhdGF0aW9uKEFubm90YXRpb24gbUFubm90YXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkNCi0Jew0KLQkJU3RyaW5nIG1Bbm5vdGF0aW9uU3RyaW5nID0gbUFubm90YXRpb24udG9TdHJpbmcoKTsNCi0JCWludCBpbmRleCA9IG1Bbm5vdGF0aW9uU3RyaW5nLmluZGV4T2YoIigiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYoaW5kZXggPT0gLTEpDQotCQl7DQotCQkJbUFubm90YXRpb25TdHJpbmcgPSBtQW5ub3RhdGlvblN0cmluZy50cmltKCk7DQotCQl9DQotCQllbHNlDQotCQl7DQotCQkJbUFubm90YXRpb25TdHJpbmcgPSBtQW5ub3RhdGlvblN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKTsNCi0JCX0NCi0JCQ0KLQkJaWYobUFubm90YXRpb25TdHJpbmcuZW5kc1dpdGgoYW5ub3RhdGlvbk5hbWUpKQ0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJIA0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BcnJheVZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0FycmF5VmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzMTg2MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0FycmF5VmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIElBcnJheVZhbHVlfQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBcnJheVZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rpb24NCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZXMNCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpbiBjYXNlIDxjb2RlPnZhbHVlczwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqLw0KLQlwdWJsaWMgQXJyYXlWYWx1ZUltcGwoU2V0PElWYWx1ZT4gdmFsdWVzKQ0KLQl7DQotCQlpZiAodmFsdWVzID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJ2YWx1ZXMgc2hvdWxkIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXRoaXMudmFsdWVzID0gdmFsdWVzOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJU3RyaW5nIHJlc3VsdCA9ICJbIjsgLy8kTk9OLU5MUy0xJA0KLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7DQotCQlmb3IgKElWYWx1ZSB2YWx1ZSA6IHZhbHVlcykNCi0JCXsNCi0JCQlpZihmaXJzdCkNCi0JCQl7DQotCQkJCXJlc3VsdCA9IHJlc3VsdCArIHZhbHVlLnRvU3RyaW5nKCk7DQotCQkJCWZpcnN0ID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2UNCi0JCQl7DQotCQkJCXJlc3VsdCA9IHJlc3VsdCArICIsICIgKyB2YWx1ZS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcmVzdWx0ID0gcmVzdWx0ICsgIl0iOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCS8vVE9ETyBjaGVjayB0aGlzIG1ldGhvZA0KLQkJQXJyYXlJbml0aWFsaXplciBhcnIgPSBhc3QubmV3QXJyYXlJbml0aWFsaXplcigpOw0KLQkJZm9yIChJVmFsdWUgdmFsdWUgOiB2YWx1ZXMpDQotCQl7DQotCQkJYXJyLmV4cHJlc3Npb25zKCkuYWRkKCgoVmFsdWVJbXBsKSB2YWx1ZSkuZ2V0RXhwcmVzc2lvbih1bml0LCBhc3QpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBhcnI7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gQXJyYXlzLmhhc2hDb2RlKHZhbHVlcy50b0FycmF5KG5ldyBJVmFsdWVbdmFsdWVzLnNpemUoKV0pKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBBcnJheVZhbHVlSW1wbCBvdGhlciA9IChBcnJheVZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIEFycmF5cy5lcXVhbHModmFsdWVzLnRvQXJyYXkobmV3IElWYWx1ZVt2YWx1ZXMuc2l6ZSgpXSksIG90aGVyLnZhbHVlcy50b0FycmF5KG5ldyBJVmFsdWVbdmFsdWVzLnNpemUoKV0pKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQXR0cmlidXRlVHlwZUVudW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BdHRyaWJ1dGVUeXBlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGJhNjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9BdHRyaWJ1dGVUeXBlRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1wdWJsaWMgZW51bSBBdHRyaWJ1dGVUeXBlRW51bSANCi17DQotCUJPT0xFQU4oIkJvb2xlYW4iKSwgLy8kTk9OLU5MUy0xJA0KLQlDTEFTUygiQ2xhc3MiKSwgLy8kTk9OLU5MUy0xJA0KLQlJTlRFR0VSKCJJbnRlZ2VyIiksIC8vJE5PTi1OTFMtMSQNCi0JUVVBTElGSUVEX05BTUUoIlF1YWxpZmllZCBOYW1lIiksIC8vJE5PTi1OTFMtMSQNCi0JU1RSSU5HKCJTdHJpbmciKTsgLy8kTk9OLU5MUy0xJA0KLQkNCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7DQotICAgIA0KLSAgICBBdHRyaWJ1dGVUeXBlRW51bShmaW5hbCBTdHJpbmcgdmFsdWUpDQotICAgIHsNCi0gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsNCi0gICAgfQ0KLQ0KLSAgICBmaW5hbCBTdHJpbmcgZ2V0VmFsdWUoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsNCi0gICAgfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQm9vbGVhblZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0Jvb2xlYW5WYWx1ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDVmZTFmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQm9vbGVhblZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotDQotLyoqDQotICogSW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBJQm9vbGVhblZhbHVlfQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQoteyAvLyRKTC1FUVVBTFMkDQotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBCb29sZWFuVmFsdWVJbXBsKGJvb2xlYW4gdmFsdWUpDQotCXsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCkNCi0Jew0KLQkJcmV0dXJuIGFzdC5uZXdCb29sZWFuTGl0ZXJhbCh2YWx1ZSk7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBCb29sZWFuVmFsdWVJbXBsIG90aGVyID0gKEJvb2xlYW5WYWx1ZUltcGwpIG9iajsNCi0JCXJldHVybiB2YWx1ZSA9PSBvdGhlci52YWx1ZTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvQ2xhc3NWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9DbGFzc1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiZGNlYTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9DbGFzc1ZhbHVlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOw0KLQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1ZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbCANCi17DQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzUU5hbWU7DQotDQotICAgIHB1YmxpYyBDbGFzc1ZhbHVlSW1wbChTdHJpbmcgY2xhc3NRTmFtZSkNCi0gICAgew0KLSAgICAgICAgdGhpcy5jbGFzc1FOYW1lID0gY2xhc3NRTmFtZTsNCi0gICAgfQ0KLQ0KLSAgICBwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLSAgICB7DQotICAgICAgICBTdHJpbmcgY2xzTmFtZSA9IHRoaXMuY2xhc3NRTmFtZTsNCi0gICAgICAgIGlmIChhZGRJbXBvcnRzKGFzdCwgdW5pdCwgY2xzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgY2xzTmFtZSA9IGdldFNpbXBsZU5hbWUoY2xzTmFtZSk7DQotICAgICAgICB9DQotICAgICAgICBOYW1lIG5hbWUgPSBhc3QubmV3TmFtZShjbHNOYW1lKTsNCi0gICAgICAgIFNpbXBsZVR5cGUgc2ltcGxlVHlwZSA9IGFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpOw0KLSAgICAgICAgVHlwZUxpdGVyYWwgbGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOw0KLSAgICAgICAgbGl0ZXJhbC5zZXRUeXBlKHNpbXBsZVR5cGUpOw0KLSAgICAgICAgcmV0dXJuIGxpdGVyYWw7DQotICAgIH0NCi0NCi0gICAgQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5jbGFzc1FOYW1lOw0KLQl9DQotICAgIA0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiB0aGlzLmNsYXNzUU5hbWUuaGFzaENvZGUoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBDbGFzc1ZhbHVlSW1wbCBvdGhlciA9IChDbGFzc1ZhbHVlSW1wbCkgb2JqOw0KLQkJcmV0dXJuIHRoaXMuY2xhc3NRTmFtZS5lcXVhbHMob3RoZXIuY2xhc3NRTmFtZSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0ludGVnZXJWYWx1ZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9JbnRlZ2VyVmFsdWVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZmZlMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0ludGVnZXJWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBmb3IgSUludGVnZXJWYWx1ZQ0KLSAqIA0KLSAqIEBhdXRob3IgUGxhbWVuIFBhdmxvdg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbnRlZ2VyVmFsdWVJbXBsIGV4dGVuZHMgVmFsdWVJbXBsDQotew0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBJbnRlZ2VyVmFsdWVJbXBsKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlOdW1iZXJMaXRlcmFsIGxpdGVyYWwgPSBhc3QubmV3TnVtYmVyTGl0ZXJhbCgpOw0KLSAgICAgICAgbGl0ZXJhbC5zZXRUb2tlbihuZXcgSW50ZWdlcih2YWx1ZSkudG9TdHJpbmcoKSk7DQotCQlyZXR1cm4gbGl0ZXJhbDsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCBoYXNoQ29kZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSW50ZWdlcih2YWx1ZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgSW50ZWdlclZhbHVlSW1wbCBvdGhlciA9IChJbnRlZ2VyVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUgPT0gb3RoZXIudmFsdWU7DQotCX0NCi0JDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9Mb2NhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0xvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5ZTg1OWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL0xvY2F0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotDQotLyoqDQotICogSW1wbGVtZW50b3Igb2Yge0BsaW5rIElMb2NhdG9yfSBpbnRlcmZhY2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgTG9jYXRvckltcGwgaW1wbGVtZW50cyBJTG9jYXRvcg0KLXsNCi0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsNCi0JcHJpdmF0ZSBpbnQgc3RhcnRQb3NpdGlvbjsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoOw0KLQkNCi0JcHVibGljIExvY2F0b3JJbXBsKGZpbmFsIGludCBsaW5lTnVtYmVyLCBmaW5hbCBpbnQgc3RhcnRQb3NpdGlvbiwgZmluYWwgaW50IGxlbmd0aCkNCi0Jew0KLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7DQotCQl0aGlzLnN0YXJ0UG9zaXRpb24gPSBzdGFydFBvc2l0aW9uOw0KLQkJdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsNCi0JfQ0KLQkNCi0JcHVibGljIGludCBnZXRMZW5ndGgoKQ0KLQl7DQotCQlyZXR1cm4gdGhpcy5sZW5ndGg7DQotCX0NCi0NCi0JcHVibGljIGludCBnZXRTdGFydFBvc2l0aW9uKCkNCi0Jew0KLQkJcmV0dXJuIHRoaXMuc3RhcnRQb3NpdGlvbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSANCi0Jew0KLQkJcmV0dXJuIGxpbmVOdW1iZXI7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1BhcmFtVmFsdWVQYWlySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1BhcmFtVmFsdWVQYWlySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Y2UzMWQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9QYXJhbVZhbHVlUGFpckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JTG9jYXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi0vKioNCi0gKiBAYXV0aG9yIFBsYW1lbiBQYXZsb3YNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZVBhaXJJbXBsIGltcGxlbWVudHMgSVBhcmFtVmFsdWVQYWlyDQotew0KLQkNCi0JcHJpdmF0ZSBJTG9jYXRvciBsb2NhdG9yID0gbnVsbDsNCi0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgcGFyYW07DQotDQotCXByaXZhdGUgSVZhbHVlIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSBwYXJhbQ0KLQkgKiBAcGFyYW0gdmFsdWUNCi0JICovDQotCXB1YmxpYyBQYXJhbVZhbHVlUGFpckltcGwoU3RyaW5nIHBhcmFtLCBJVmFsdWUgdmFsdWUpDQotCXsNCi0JCXRoaXMucGFyYW0gPSBwYXJhbTsNCi0JCXRoaXMudmFsdWUgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtKCkNCi0Jew0KLQkJcmV0dXJuIHBhcmFtOw0KLQl9DQotDQotCXB1YmxpYyBJVmFsdWUgZ2V0VmFsdWUoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlpZih2YWx1ZSAhPSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiAzMSAqIHBhcmFtLmhhc2hDb2RlKCkgKyB2YWx1ZS5oYXNoQ29kZSgpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCXJldHVybiAzMSAqIHBhcmFtLmhhc2hDb2RlKCk7DQotCQl9DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgUGFyYW1WYWx1ZVBhaXJJbXBsIG90aGVyID0gKFBhcmFtVmFsdWVQYWlySW1wbCkgb2JqOw0KLQkJaWYgKCFwYXJhbS5lcXVhbHMob3RoZXIucGFyYW0pKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB2YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpDQotCXsNCi0JCXJldHVybiB0aGlzLmxvY2F0b3I7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0TG9jYXRvcihmaW5hbCBJTG9jYXRvciBsb2NhdG9yKQ0KLQl7DQotCQl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9RdWFsaWZpZWROYW1lVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL2Fubm90YXRpb25zL2ltcGwvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YmI2NmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9RdWFsaWZpZWROYW1lVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBmb3Ige0BsaW5rIElRdWFsaWZpZWROYW1lVmFsdWV9DQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIFF1YWxpZmllZE5hbWVWYWx1ZUltcGwgZXh0ZW5kcyBWYWx1ZUltcGwNCi17DQotCXByaXZhdGUgU3RyaW5nIHZhbHVlOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICogDQotCSAqIEBwYXJhbSB2YWx1ZQ0KLQkgKi8NCi0JcHVibGljIFF1YWxpZmllZE5hbWVWYWx1ZUltcGwoU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQl0aGlzLnZhbHVlID0gdmFsdWU7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IHVuaXQsIEFTVCBhc3QpDQotCXsNCi0JCS8vICJqYXZheC5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEIg0KLQkJaW50IGkgPSB2YWx1ZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKGkgIT0gLTEpDQotCQl7DQotCQkJU3RyaW5nIGNsc05hbWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgaSk7DQotCQkJaWYgKGFkZEltcG9ydHMoYXN0LCB1bml0LCBjbHNOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBhc3QubmV3TmFtZShnZXRTaW1wbGVOYW1lKGNsc05hbWUpICsgdmFsdWUuc3Vic3RyaW5nKGkpKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gYXN0Lm5ld05hbWUodmFsdWUpOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkNCi0Jew0KLQkJcmV0dXJuIHZhbHVlLmhhc2hDb2RlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKQ0KLQl7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQl7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAob2JqID09IG51bGwpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQotCQl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJZmluYWwgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbCBvdGhlciA9IChRdWFsaWZpZWROYW1lVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1N0cmluZ1ZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1N0cmluZ1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1OGJkMWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9TdHJpbmdWYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRvciBmb3IgSVN0cmluZ1ZhbHVlDQotICogDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotcHVibGljIGNsYXNzIFN0cmluZ1ZhbHVlSW1wbCBleHRlbmRzIFZhbHVlSW1wbA0KLXsNCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIHZhbHVlDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nVmFsdWVJbXBsKFN0cmluZyB2YWx1ZSkNCi0Jew0KLQkJdGhpcy52YWx1ZSA9IHZhbHVlOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCB1bml0LCBBU1QgYXN0KQ0KLQl7DQotCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSBhc3QubmV3U3RyaW5nTGl0ZXJhbCgpOw0KLQkJbGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUodmFsdWUpOw0KLQkJcmV0dXJuIGxpdGVyYWw7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWUuaGFzaENvZGUoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopDQotCXsNCi0JCWlmICh0aGlzID09IG9iaikNCi0JCXsNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCWlmIChvYmogPT0gbnVsbCkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkNCi0JCXsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmaW5hbCBTdHJpbmdWYWx1ZUltcGwgb3RoZXIgPSAoU3RyaW5nVmFsdWVJbXBsKSBvYmo7DQotCQlyZXR1cm4gdmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQ0KLQl7DQotCQlyZXR1cm4gdmFsdWU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1ZhbHVlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9pbXBsL1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4OGM1NzE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvaW1wbC9WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogQGF1dGhvciBQbGFtZW4gUGF2bG92DQotICovDQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbHVlSW1wbCBpbXBsZW1lbnRzIElWYWx1ZQ0KLXsNCi0JcHJpdmF0ZSBJTG9jYXRvciBsb2NhdG9yID0gbnVsbDsNCi0NCi0JcHJvdGVjdGVkIGFic3RyYWN0IEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgdW5pdCwgQVNUIGFzdCk7DQotDQotCQ0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSW1wb3J0cyhBU1QgYXN0LCBDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGFubm90YXRpb25OYW1lKQ0KLQl7DQotCQlTdHJpbmcgcGFja2FnZUFubm90YXRpb25OYW1lID0gZ2V0UGFja2FnZU5hbWUoYW5ub3RhdGlvbk5hbWUpOw0KLQkJaWYgKHBhY2thZ2VBbm5vdGF0aW9uTmFtZSA9PSBudWxsKQ0KLQkJew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmIChwYWNrYWdlQW5ub3RhdGlvbk5hbWUuZXF1YWxzKCJqYXZhLmxhbmciKSkgLy8kTk9OLU5MUy0xJA0KLQkJew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKHVuaXQgIT0gbnVsbCkNCi0JCXsNCi0JCQlJbXBvcnREZWNsYXJhdGlvbiBpbXAgPSBhc3QubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsNCi0JCQlpbXAuc2V0TmFtZShhc3QubmV3TmFtZShhbm5vdGF0aW9uTmFtZSkpOw0KLQkJCUxpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMgPSB1bml0LmltcG9ydHMoKTsNCi0JCQlTdHJpbmcgaW1wMSA9IGdldEltcG9ydChpbXBvcnRzLCBnZXRTaW1wbGVOYW1lKGFubm90YXRpb25OYW1lKSk7DQotCQkJaWYgKGltcDEgPT0gbnVsbCkNCi0JCQl7DQotCQkJCWlmIChnZXRPbkRlbWFuZEltcG9ydChpbXBvcnRzLCBwYWNrYWdlQW5ub3RhdGlvbk5hbWUpID09IG51bGwpDQotCQkJCXsNCi0JCQkJCWltcG9ydHMuYWRkKGltcCk7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCWlmICghaW1wMS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0SW1wb3J0KExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGltcG9ydHMsIFN0cmluZyBpbXApDQotCXsNCi0JCUl0ZXJhdG9yPEltcG9ydERlY2xhcmF0aW9uPiBpdGVyID0gaW1wb3J0cy5pdGVyYXRvcigpOw0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCUltcG9ydERlY2xhcmF0aW9uIG5leHQgPSBpdGVyLm5leHQoKTsNCi0JCQlOYW1lIGZxTmFtZSA9IG5leHQuZ2V0TmFtZSgpOw0KLQkJCVNpbXBsZU5hbWUgbmFtZTsNCi0JCQlpZiAoZnFOYW1lLmlzUXVhbGlmaWVkTmFtZSgpKQ0KLQkJCXsNCi0JCQkJbmFtZSA9ICgoUXVhbGlmaWVkTmFtZSkgZnFOYW1lKS5nZXROYW1lKCk7DQotCQkJfSBlbHNlDQotCQkJew0KLQkJCQluYW1lID0gKFNpbXBsZU5hbWUpIGZxTmFtZTsNCi0JCQl9DQotCQkJU3RyaW5nIHNpbXBsZU5hbWUgPSBuYW1lLmdldElkZW50aWZpZXIoKTsNCi0JCQlpZiAoaW1wLmVxdWFscyhzaW1wbGVOYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBmcU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0T25EZW1hbmRJbXBvcnQoTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cywgU3RyaW5nIGltcCkNCi0Jew0KLQkJSXRlcmF0b3I8SW1wb3J0RGVjbGFyYXRpb24+IGl0ZXIgPSBpbXBvcnRzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpDQotCQl7DQotCQkJSW1wb3J0RGVjbGFyYXRpb24gbmV4dCA9IGl0ZXIubmV4dCgpOw0KLQkJCWlmICghbmV4dC5pc09uRGVtYW5kKCkpDQotCQkJew0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotCQkJTmFtZSBmcU5hbWUgPSBuZXh0LmdldE5hbWUoKTsNCi0JCQlTdHJpbmcgbmFtZSA9IGZxTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsNCi0JCQlpZiAoaW1wLmVxdWFscyhuYW1lKSkNCi0JCQl7DQotCQkJCXJldHVybiBuYW1lOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBuYW1lKQ0KLQl7DQotCQlpbnQgaSA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsNCi0JCWlmIChpID09IC0xKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGkpOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIG5hbWUpDQotCXsNCi0JCWludCBpID0gbmFtZS5sYXN0SW5kZXhPZignLicpOw0KLQkJaWYgKGkgPT0gLTEpDQotCQkJcmV0dXJuIG5hbWU7DQotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaSArIDEpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSUxvY2F0b3IgZ2V0TG9jYXRvcigpDQotCXsNCi0JCXJldHVybiB0aGlzLmxvY2F0b3I7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0TG9jYXRvcihmaW5hbCBJTG9jYXRvciBsb2NhdG9yKQ0KLQl7DQotCQl0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvcGx1Z2luL0pheHdzVXRpbHNQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvcGx1Z2luL0pheHdzVXRpbHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRkM2ZhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3BsdWdpbi9KYXh3c1V0aWxzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5wbHVnaW47DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsNCi0NCi1wdWJsaWMgY2xhc3MgSmF4d3NVdGlsc1BsdWdpbiBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElTdGFydHVwDQotew0KLQkvLyBUaGUgcGx1Zy1pbiBJRA0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzIjsNCi0NCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQlwcml2YXRlIHN0YXRpYyBKYXh3c1V0aWxzUGx1Z2luIHBsdWdpbjsNCi0JDQotCS8qKg0KLQkgKiBUaGUgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBKYXh3c1V0aWxzUGx1Z2luKCkgew0KLQl9DQotDQotCS8qDQotCSAqIChub24tSmF2YWRvYykNCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCQkNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gew0KLQkJcGx1Z2luID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQ0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSmF4d3NVdGlsc1BsdWdpbiBnZXREZWZhdWx0KCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKQ0KLQl7DQotCQkvLyBOb3RoaW5nIHRvIGRvLiBIb3dldmVyLCB0aGlzIHB1Z2luIGhhcyB0byBzdGFydCBhcyBlYXJseSBhcyBwb3NzaWJsZSBzaW5jZSBpdHMgc2VydmljZXMgd2lsbCBiZSB1c2VkIGZvciBjb21tb24gbG9nZ2luZw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJkNGQzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9pbnRlcm5hbC90ZXh0L0pheFdzVXRpbE1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOw0KLQ0KLXB1YmxpYyBjbGFzcyBKYXhXc1V0aWxNZXNzYWdlcyBleHRlbmRzIE5MUw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJA0KLQkNCi0JDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhbm5vdFBlcmZvcm1FZGl0TXNnOw0KLQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wVW5pdE1pc3NpbmdNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRUcmVlU3RhdGVNc2c7DQotDQotDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZzsNCi0NCi0NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblV0aWxzX1BhcmFtU2hvdWxkTm90QmVOdWxsTXNnOw0KLQ0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0UmVzb3VyY2VzTWFuYWdlcl9GSUxFX0NPTlRFTlRTX0NIQU5HRV9GQUlMRURfTVNHOw0KLQkNCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdE1hbmFnZW1lbnRVdGlsc19Qcm9qZWN0SGFzTm9NZXRhSW5mRm9sZGVyTXNnOw0KLQkNCi0Jc3RhdGljDQotCXsNCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpheFdzVXRpbE1lc3NhZ2VzLmNsYXNzKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2ludGVybmFsL3RleHQvSmF4V3NVdGlsTWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZGNmZWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvaW50ZXJuYWwvdGV4dC9KYXhXc1V0aWxNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLUNhbm5vdFBlcmZvcm1FZGl0TXNnCQkJCQkJCQkJCQkJPSBFZGl0IGNhbm5vdCBiZSBwZXJmb3JtZWQNCi1Db21wVW5pdE1pc3NpbmdNc2cJCQkJCQkJCQkJCQkJPSBDb21waWxhdGlvbiB1bml0IGZpbGUgbWlzc2luZw0KLUludmFsaWRUcmVlU3RhdGVNc2cJCQkJCQkJCQkJCQkJPSBJbnZhbGlkIHByb2plY3QgdHJlZSBzdGF0ZQ0KLUFubm90YXRpb25DYW5ub3RCZVN0b3JlZE1zZwkJCQkJCQkJCQkJPSBBbm5vdGF0aW9uIGNvdWxkIG5vdCBiZSBzdG9yZWQsIHRoZSBmaWxlIGlzIG5vdCB3cml0YWJsZQ0KLUFubm90YXRpb25VdGlsc19QYXJhbVNob3VsZE5vdEJlTnVsbE1zZwkJCQkJCQkJPSB7MH0gc2hvdWxkIG5vdCBiZSBudWxsDQotDQotRWRpdFJlc291cmNlc01hbmFnZXJfRklMRV9DT05URU5UU19DSEFOR0VfRkFJTEVEX01TRwkJCQk9IEZpbGUgY29udGVudHMgY291bGQgbm90IGJlIHNldA0KLVByb2plY3RNYW5hZ2VtZW50VXRpbHNfUHJvamVjdEhhc05vTWV0YUluZkZvbGRlck1zZwkJCQkJPSBwcm9qZWN0IHswfSBkb2VzIG5vdCBoYXZlIGEgTUVUQS1JTkYgZm9sZGVyDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0lMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9JTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU3ZjkyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9sb2dnaW5nL0lMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmc7DQotDQotcHVibGljIGludGVyZmFjZSBJTG9nZ2VyDQotew0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSBlcnJvci4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKGZpbmFsIFN0cmluZyBtZXNzYWdlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZXJyb3IuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqIEBwYXJhbSBjYXVzZQ0KLQkgKiAgICAgICAgICAgIGNhdXNpbmcgZXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgd2FybmluZy4NCi0JICogDQotCSAqIEBwYXJhbSBtZXNzYWdlDQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQNCi0JICovDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oZmluYWwgU3RyaW5nIG1lc3NhZ2UpOw0KLQ0KLQkvKioNCi0JICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSB3YXJuaW5nLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nV2FybihmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKTsNCi0NCi0JLyoqDQotCSAqIExvZ3MgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgZGVidWcuDQotCSAqIA0KLQkgKiBAcGFyYW0gbWVzc2FnZQ0KLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSk7DQotDQotCS8qKg0KLQkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5IGRlYnVnLg0KLQkgKiANCi0JICogQHBhcmFtIG1lc3NhZ2UNCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZA0KLQkgKiBAcGFyYW0gY2F1c2UNCi0JICogICAgICAgICAgICBjYXVzaW5nIGV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbG9nRGVidWcoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSk7DQotDQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlYnVnKCk7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvbG9nZ2luZy9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWZhZDMxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL2xvZ2dpbmcvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLlN0YXR1c1V0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwucGx1Z2luLkpheHdzVXRpbHNQbHVnaW47DQotDQotcHVibGljIGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXINCi17DQotCXB1YmxpYyB2b2lkIGxvZ0RlYnVnKFN0cmluZyBtZXNzYWdlKQ0KLQl7DQotLy8JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNJbmZvKG1lc3NhZ2UpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBsb2dEZWJ1ZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKQ0KLQl7DQotLy8JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNJbmZvKG1lc3NhZ2UsIGNhdXNlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCWxvZygpLmxvZyhTdGF0dXNVdGlscy5zdGF0dXNFcnJvcihtZXNzYWdlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKG1lc3NhZ2UsIGNhdXNlKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbG9nV2FybihTdHJpbmcgbWVzc2FnZSkNCi0Jew0KLQkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c1dhcm5pbmcobWVzc2FnZSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvZ1dhcm4oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJbG9nKCkubG9nKFN0YXR1c1V0aWxzLnN0YXR1c1dhcm5pbmcobWVzc2FnZSwgY2F1c2UpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElMb2cgbG9nKCkNCi0Jew0KLQkJcmV0dXJuIEpheHdzVXRpbHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzRGVidWcoKQ0KLQl7DQotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRWRpdFJlc291cmNlc01hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0VkaXRSZXNvdXJjZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI2Mzk4YTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRWRpdFJlc291cmNlc01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuU3RhdHVzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotLyoqDQotICogVGhpcyBpcyBhbiB1dGlsaXR5IGNsYXNzIHdoaWNoIGlzIG1lYW50IHRvIHByb3ZpZGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdG8gc2F2ZSBhbmQgbW9kaWZ5IHJlc291cmNlcy4gSXQgaXMgYSB3cmFwcGVyIG9mIHRoZSBlY2xpcHNlIEFQSSBhbmQNCi0gKiB3b3JrYXJvdW5kcyBzb21lIERUUiBpc3N1ZXMuIFVudGlsIERUUiBjb2xsZWFndWVzIGZpeCB0aGVpciBjb2RpbmcsIHRoaXMgbWFuYWdlciBtdXN0IGJlIHVzZWQgb24gZWFjaCBmaWxlIG1vZGlmaWNhdGlvbiBvY2Nhc2lvbg0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGNsYXNzIEVkaXRSZXNvdXJjZXNNYW5hZ2VyDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoKTsNCi0JDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmlsaXR5IG9mIGEgZmlsZS4gSW4gY2FzZSB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgYWxyZWFkeSB3cml0YWJsZSwgPGNvZGU+U3RhdHVzLk9LX1NUQVRVUzwvY29kZT4gaXMgcmV0dXJuZWQNCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgVGhlIGZpbGUgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEBwYXJhbSBjb250ZXh0DQotCSAqICAgICAgICAgICAgZWl0aGVyIHtAbGluayBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVH0sIG9yIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIHRvIHBhcmVudCBhbnkNCi0JICogICAgICAgICAgICBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gYXZvaWQgYW55IGRpcmVjdA0KLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBzcGVjaWZpZWQgaXMgbnVsbA0KLQkgKiBAc2VlIElXb3Jrc3BhY2UjVkFMSURBVEVfUFJPTVBUDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlRWRpdGFibGUoSUZpbGUgZmlsZSwgT2JqZWN0IGNvbnRleHQpDQotCXsNCi0JCWlmIChmaWxlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKCFmaWxlLmlzUmVhZE9ubHkoKSkNCi0JCXsNCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0NCi0JCQ0KLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBmaWxlLmdldFdvcmtzcGFjZSgpOw0KLQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyBmaWxlIH0sIGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmxpbGl0eSBvZiBhIGZpbGUuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnZva2luZw0KLQkgKiA8Y29kZT5zZXRGaWxlRWRpdGFibGUoZmlsZSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogICAgICAgICAgICBUaGUgZmlsZSB0byBiZSBzZXQgZWRpdGFibGUNCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBudWxsDQotCSAqIEBzZWUgRWRpdFJlc291cmNlc01hbmFnZXIjc2V0RmlsZUVkaXRhYmxlKElGaWxlLCBPYmplY3QpDQotCSAqIEBzZWUgSVdvcmtzcGFjZSNWQUxJREFURV9QUk9NUFQNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlRWRpdGFibGUoSUZpbGUgZmlsZSkNCi0Jew0KLQkJcmV0dXJuIHNldEZpbGVFZGl0YWJsZShmaWxlLCBJV29ya3NwYWNlLlZBTElEQVRFX1BST01QVCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgZWRpdGFibGlsaXR5IG9mIGFuIGFycmF5IG9mIGZpbGVzLiBJbiBjYXNlIGFsbCBmaWxlcyBzcGVjaWZpZWQgYXJlIGFscmVhZHkgd3JpdGFibGUsIDxjb2RlPlN0YXR1cy5PS19TVEFUVVM8L2NvZGU+IGlzIHJldHVybmVkDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZXMNCi0JICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgZmlsZXMgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEBwYXJhbSBjb250ZXh0DQotCSAqICAgICAgICAgICAgZWl0aGVyIHtAbGluayBJV29ya3NwYWNlI1ZBTElEQVRFX1BST01QVH0sIG9yIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZSB1c2VkIHRvIHBhcmVudCBhbnkNCi0JICogICAgICAgICAgICBkaWFsb2dzIHdpdGggdGhlIHVzZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdG8gYXZvaWQgYW55IGRpcmVjdA0KLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZXMgb24gdGhlIFNXVCBjb21wb25lbnQpDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGFycmF5IGlzIGVtcHR5IG9yIG51bGwNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVzRWRpdGFibGUoSUZpbGVbXSBmaWxlcywgT2JqZWN0IGNvbnRleHQpDQotCXsNCi0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IG11c3Qgbm90IGJlIGVtcHR5IG5vciBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCUxpc3Q8SUZpbGU+IHJvRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOw0KLQkJZm9yKElGaWxlIGYgOiBmaWxlcykNCi0JCXsNCi0JCQlpZihmLmlzUmVhZE9ubHkoKSkNCi0JCQl7DQotCQkJCXJvRmlsZXMuYWRkKGYpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJaWYocm9GaWxlcy5zaXplKCkgPT0gMCkNCi0JCXsNCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCX0NCi0NCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gcm9GaWxlcy5nZXQoMCkuZ2V0V29ya3NwYWNlKCk7DQotCQlyZXR1cm4gd29ya3NwYWNlLnZhbGlkYXRlRWRpdChyb0ZpbGVzLnRvQXJyYXkobmV3IElGaWxlW3JvRmlsZXMuc2l6ZSgpXSksIGNvbnRleHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIGVkaXRhYmxpbGl0eSBvZiBhbiBhcnJheSBvZiBmaWxlcy4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIGludm9raW5nDQotCSAqIDxjb2RlPnNldEZpbGVzRWRpdGFibGUoZmlsZXMsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTwvY29kZT4gDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZXMNCi0JICogICAgICAgICAgICBUaGUgYXJyYXkgb2YgZmlsZXMgdG8gYmUgc2V0IGVkaXRhYmxlDQotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGFycmF5IGlzIGVtcHR5IG9yIG51bGwNCi0JICogQHNlZSBFZGl0UmVzb3VyY2VzTWFuYWdlciNzZXRGaWxlc0VkaXRhYmxlKElGaWxlW10sIE9iamVjdCkNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVzRWRpdGFibGUoSUZpbGVbXSBmaWxlcykNCi0Jew0KLQkJcmV0dXJuIHNldEZpbGVzRWRpdGFibGUoZmlsZXMsIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBvZiBhIGZpbGUNCi0JICogDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgc2V0DQotCSAqIEBwYXJhbSBjb250ZW50DQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdG8gYmUgc2V0DQotCSAqIEBwYXJhbSB1cGRhdGVGbGFncw0KLQkgKiAgICAgICAgICAgIHVwZGF0ZSBmbGFncy4NCi0JICogQHNlZSBJRmlsZSNzZXRDb250ZW50cyhqYXZhLmlvLklucHV0U3RyZWFtLCBpbnQsIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3INCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZA0KLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5maWxlPC9jb2RlPiBvciA8Y29kZT5jb250ZW50PC9jb2RlPiBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgSVN0YXR1cyBzZXRGaWxlQ29udGVudHMoSUZpbGUgZmlsZSwgU3RyaW5nIGNvbnRlbnQsIGludCB1cGRhdGVGbGFncywgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpDQotCXsNCi0JCWlmIChmaWxlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCWlmIChjb250ZW50ID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlTdGF0dXMgZWRpdFN0YXR1cyA9IHNldEZpbGVFZGl0YWJsZShmaWxlKTsNCi0JCWlmIChlZGl0U3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykNCi0JCXsNCi0JCQkvLyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB2YWxpZGF0ZUVkaXQgb3BlcmF0aW9uDQotCQkJcmV0dXJuIGVkaXRTdGF0dXM7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlmaWxlLnNldENvbnRlbnRzKG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoY29udGVudCksIHVwZGF0ZUZsYWdzLCBwcm9ncmVzc01vbml0b3IpOw0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJcmV0dXJuIFN0YXR1c1V0aWxzLnN0YXR1c0Vycm9yKEpheFdzVXRpbE1lc3NhZ2VzLkVkaXRSZXNvdXJjZXNNYW5hZ2VyX0ZJTEVfQ09OVEVOVFNfQ0hBTkdFX0ZBSUxFRF9NU0csIGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IG9mIGEgZmlsZS4gVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCBvZiBpbnZva2luZw0KLQkgKiA8Y29kZT5zZXRGaWxlQ29udGVucyhJRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCwgKGtlZXBIaXN0b3J5ID8gSUZpbGUuS0VFUF9ISVNUT1JZIDogSVJlc291cmNlLk5PTkUpIHwgKGZvcmNlID8gSUZpbGUuRk9SQ0UgOiBJUmVzb3VyY2UuTk9ORSksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZQ0KLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldA0KLQkgKiBAcGFyYW0gZm9yY2UNCi0JICogICAgICAgICAgICBhIGZsYWcgY29udHJvbGxpbmcgaG93IHRvIGRlYWwgd2l0aCByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGluIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0NCi0JICogQHBhcmFtIGtlZXBIaXN0b3J5DQotCSAqICAgICAgICAgICAgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3Qgc3RvcmUgdGhlIGN1cnJlbnQgY29udGVudHMgaW4gdGhlIGxvY2FsIGhpc3RvcnkNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZA0KLQkgKiBAcmV0dXJuIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5maWxlPC9jb2RlPiBvciA8Y29kZT5jb250ZW50PC9jb2RlPiBpcyBudWxsDQotCSAqIEBzZWUgRWRpdFJlc291cmNlc01hbmFnZXIjc2V0RmlsZUNvbnRlbnRzKElGaWxlLCBTdHJpbmcsIGludCwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJU3RhdHVzIHNldEZpbGVDb250ZW50cyhJRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiBrZWVwSGlzdG9yeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQl7DQotCQlyZXR1cm4gc2V0RmlsZUNvbnRlbnRzKGZpbGUsIGNvbnRlbnQsICgoa2VlcEhpc3RvcnkgPyBJRmlsZS5LRUVQX0hJU1RPUlkgOiBJUmVzb3VyY2UuTk9ORSkgfCAoZm9yY2UgPyBJRmlsZS5GT1JDRSA6IElSZXNvdXJjZS5OT05FKSksIG1vbml0b3IpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0ZpbGVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRkZGIzYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvRmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi0NCi0vKioNCi0gKiBJbXBsZW1lbnRhdGlvbiBmb3IgZmlsZSB1dGlsaXRpZXMgaW50ZXJmYWNlDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzIGltcGxlbWVudHMgSUZpbGVVdGlscyB7DQotCXByaXZhdGUgc3RhdGljIElGaWxlVXRpbHMgdXRpbHMgPSBudWxsOw0KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXggPSAwOw0KLQ0KLQlwdWJsaWMgRmlsZVV0aWxzKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBUaGUgZmFjdG9yeSBtZXRob2QNCi0JICogDQotCSAqIEByZXR1cm4gYSBGaWxlVXRpbHMgaW5zdGFuY2UNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUZpbGVVdGlscyBnZXRJbnN0YW5jZSgpIHsNCi0JCWlmICh1dGlscyA9PSBudWxsKSB7DQotCQkJdXRpbHMgPSBuZXcgRmlsZVV0aWxzKCk7DQotCQl9DQotDQotCQlyZXR1cm4gdXRpbHM7DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIExpc3Q8SUVkaXRvclBhcnQ+IGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbigNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4gdW5pdHMgPSBnZXRDb21waWxhdGlvblVuaXRzKGZpbGVMb2NhdGlvbik7DQotCQlTZXQ8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBuZXcgSGFzaFNldDxJRWRpdG9yUGFydD4oKTsNCi0JCWZvciAoSUNvbXBpbGF0aW9uVW5pdCBjdSA6IHVuaXRzKSB7DQotCQkJZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3IgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKGN1DQotCQkJCQkuZ2V0RWxlbWVudE5hbWUoKSk7DQotCQkJZWRpdG9ycy5hZGRBbGwoZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KGVkaXRvckRlc2NyLA0KLQkJCQkJZ2V0QWN0aXZlV29ya2JlbmNoUGFnZSgpLCBjdSkpOw0KLQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZWRpdG9ycy50b0FycmF5KG5ldyBJRWRpdG9yUGFydFtlZGl0b3JzLnNpemUoKV0pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgTGlzdDxJQ29tcGlsYXRpb25Vbml0PiBnZXRDb21waWxhdGlvblVuaXRzKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gew0KLQkJaWYgKGZpbGVMb2NhdGlvbiA9PSBudWxsKSB7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmaWxlTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJSUZpbGVbXSBmaWxlc0ZvdW5kID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQ0KLQkJCQkuZmluZEZpbGVzRm9yTG9jYXRpb25VUkkobmV3IEZpbGUoZmlsZUxvY2F0aW9uKS50b1VSSSgpKTsNCi0JCWlmIChmaWxlc0ZvdW5kID09IG51bGwgfHwgZmlsZXNGb3VuZC5sZW5ndGggPT0gMCkgew0KLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkZpbGU6ICIgKyBmaWxlTG9jYXRpb24gKyAiIGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQ0KLQkJTGlzdDxJQ29tcGlsYXRpb25Vbml0PiB1bml0cyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4oKTsNCi0NCi0JCWZvciAoSUZpbGUgZmlsZSA6IGZpbGVzRm91bmQpIHsNCi0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUoZmlsZSk7DQotCQkJaWYgKCEoamF2YUVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSkgew0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGaWxlOiAiICsgZmlsZUxvY2F0aW9uICsgIiBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0NCi0JCQl1bml0cy5hZGQoKElDb21waWxhdGlvblVuaXQpIGphdmFFbGVtZW50KTsNCi0JCX0NCi0NCi0JCXJldHVybiB1bml0czsNCi0JfQ0KLQkJCQ0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdFVuaXQoU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCQ0KLQkJaWYgKGZpbGVMb2NhdGlvbiA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiZmlsZUxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZUxvY2F0aW9uKSk7DQotCQlpZiAoZmlsZSA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkZpbGU6ICIgKyBmaWxlTG9jYXRpb24gKyAiIGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdCgpOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRmlsZURpc3BsYXllZEluRGlydHlFZGl0b3IoZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCXJldHVybiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKGdldEVkaXRvcnNCeUZpbGVMb2NhdGlvbihmaWxlTG9jYXRpb24pKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB1bml0KSB7DQotCQlyZXR1cm4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQodW5pdCkpOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCB2b2lkIHNhdmVFZGl0b3IoU3RyaW5nIGZpbGVMb2NhdGlvbikNCi0JCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCXNhdmVFZGl0b3IoZmlsZUxvY2F0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzYXZlRWRpdG9yKGZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24sDQotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsNCi0JCUxpc3Q8SUVkaXRvclBhcnQ+IGVkaXRvcnMgPSBnZXRFZGl0b3JzQnlGaWxlTG9jYXRpb24oZmlsZUxvY2F0aW9uKTsNCi0JCWlmIChlZGl0b3JzLnNpemUoKSA9PSAwKSB7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGZpbGUgaXMgbm90IGRpc3BsYXllZCBieSBhbiBlZGl0b3IiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJc2F2ZUVkaXRvcnMoZWRpdG9ycywgbW9uaXRvcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1LA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycyA9IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChjdSk7DQotCQlpZiAoZWRpdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXNhdmVFZGl0b3JzKGVkaXRvcnMsIG1vbml0b3IpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9ycyA9IGdldEVkaXRvcnNCeUNvbXBpbGF0aW9uVW5pdChjdSk7DQotCQlpZiAoZWRpdG9ycy5zaXplKCkgPT0gMCkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBkaXNwbGF5ZWQgYnkgYW4gZWRpdG9yIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXNhdmVFZGl0b3JzKGVkaXRvcnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzYXZlRWRpdG9ycyhmaW5hbCBMaXN0PElFZGl0b3JQYXJ0PiBlZGl0b3JzLA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJZm9yIChJRWRpdG9yUGFydCBlIDogZWRpdG9ycykgew0KLQkJCWlmIChlLmlzRGlydHkoKSkgew0KLQkJCQllLmRvU2F2ZShtb25pdG9yKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGdldERpcnR5RWRpdG9ycygpIHsNCi0JCWZpbmFsIFNldDxJRWRpdG9ySW5wdXQ+IGlucHV0cyA9IG5ldyBIYXNoU2V0PElFZGl0b3JJbnB1dD4oKTsNCi0JCWZpbmFsIENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7DQotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7DQotCQlmaW5hbCBJV29ya2JlbmNoV2luZG93W10gd2luZG93cyA9IHdvcmtiZW5jaC5nZXRXb3JrYmVuY2hXaW5kb3dzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsNCi0JCQlmaW5hbCBJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOw0KLQkJCWZvciAoaW50IHggPSAwOyB4IDwgcGFnZXMubGVuZ3RoOyB4KyspIHsNCi0JCQkJZmluYWwgSUVkaXRvclBhcnRbXSBlZGl0b3JzID0gcGFnZXNbeF0uZ2V0RGlydHlFZGl0b3JzKCk7DQotCQkJCWZvciAoaW50IHogPSAwOyB6IDwgZWRpdG9ycy5sZW5ndGg7IHorKykgew0KLQkJCQkJZmluYWwgSUVkaXRvclBhcnQgZXAgPSBlZGl0b3JzW3pdOw0KLQkJCQkJZmluYWwgSUVkaXRvcklucHV0IGlucHV0ID0gZXAuZ2V0RWRpdG9ySW5wdXQoKTsNCi0JCQkJCWlmICghaW5wdXRzLmNvbnRhaW5zKGlucHV0KSkgew0KLQkJCQkJCWlucHV0cy5hZGQoaW5wdXQpOw0KLQkJCQkJCXJlc3VsdC5hZGQoZXApOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQlwcml2YXRlIElFZGl0b3JEZXNjcmlwdG9yIGdldEVkaXRvckRlc2NyaXB0b3IoU3RyaW5nIGZpbGVOYW1lKSB7DQotCQlJRWRpdG9yUmVnaXN0cnkgZWRpdG9yUmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQotCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOw0KLQkJcmV0dXJuIGVkaXRvclJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZU5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb252ZXJ0cyBhIFN0cmluZyB0byBhIFVSTCwgYXNzdW1pbmcgJ2ZpbGU6JyBhcyBhIGRlZmF1bHQgc2NoZW1lLg0KLQkgKiANCi0JICogQHBhcmFtIGJhc2UNCi0JICogQHBhcmFtIHBhdGgNCi0JICogDQotCSAqIEByZXR1cm4NCi0JICogDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24sDQotCSAqICAgICAgICAgICAgIGlmIHRoZSBTdHJpbmcgaXMgbmVpdGhlciBhIHZhbGlkIFVSTCwgbm9yIGEgdmFsaWQgZmlsZW5hbWUuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIFVSTCBmaWxlT3JVUkxUb1VSTChmaW5hbCBVUkwgYmFzZSwgZmluYWwgU3RyaW5nIHBhdGgpDQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmIChwYXRoID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInBhdGgiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJU3RyaW5nIGxvY2FsUGF0aCA9IHBhdGg7DQotCQlVUkwgbG9jYWxCYXNlID0gYmFzZTsNCi0NCi0JCWlmIChsb2NhbEJhc2UgPT0gbnVsbCkgew0KLQkJCWxvY2FsQmFzZSA9IG5ldyBVUkwoImZpbGU6Iik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJbG9jYWxQYXRoID0gbG9jYWxQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsNCi0JCXRyeSB7DQotCQkJU3RyaW5nIHByb3RvY29sID0gbG9jYWxCYXNlLmdldFByb3RvY29sKCk7DQotCQkJaWYgKCEiaHR0cCIuZXF1YWxzKHByb3RvY29sKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAhImh0dHBzIi5lcXVhbHMocHJvdG9jb2wpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSYmIChsb2NhbFBhdGguY2hhckF0KDEpID09ICc6Jw0KLQkJCQkJCQl8fCBsb2NhbFBhdGguY2hhckF0KDApID09ICcvJyB8fCBsb2NhbFBhdGgNCi0JCQkJCQkJLmNoYXJBdCgwKSA9PSAnXFwnKSkgew0KLQkJCQlsb2NhbFBhdGggPSAobmV3IEZpbGUobG9jYWxQYXRoKSkudG9VUkkoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQotCQkJLy8gJEpMLUVYQyQNCi0JCX0NCi0NCi0JCWlmIChsb2NhbFBhdGguc3RhcnRzV2l0aCgiZmlsZToiKSAmJiBsb2NhbFBhdGgubGVuZ3RoKCkgPiA1IC8vJE5PTi1OTFMtMSQNCi0JCQkJJiYgbG9jYWxQYXRoLmNoYXJBdCg1KSAhPSAnLycpIHsNCi0JCQlsb2NhbFBhdGggPSAiZmlsZTovIi5jb25jYXQobG9jYWxQYXRoLnN1YnN0cmluZyg1KSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJaWYgKGxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8vIikgLy8kTk9OLU5MUy0xJA0KLQkJCQkJJiYgIWxvY2FsUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8vLy8iKSAvLyROT04tTkxTLTEkDQotCQkJCQkmJiAhbG9jYWxQYXRoLnN0YXJ0c1dpdGgoImZpbGU6Ly9sb2NhbGhvc3QvIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlsb2NhbFBhdGggPSAiZmlsZTovLy8vIi5jb25jYXQobG9jYWxQYXRoLnN1YnN0cmluZygiZmlsZTovLyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCQkJLmxlbmd0aCgpKSk7DQotCQkJfQ0KLQkJfQ0KLQkJVVJMIHVybCA9IG5ldyBVUkwobG9jYWxCYXNlLCBsb2NhbFBhdGgpOw0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQ0KLQlwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KCkgew0KLQkJU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQNCi0JCWluZGV4Kys7DQotCQlGaWxlIHRlbXAxID0gbmV3IEZpbGUodGVtcERpciwgSW50ZWdlci50b1N0cmluZyh0aGlzLmhhc2hDb2RlKCkpICsgIl8iIC8vJE5PTi1OTFMtMSQNCi0JCQkJKyBpbmRleCk7DQotCQl0ZW1wMS5ta2RpcigpOw0KLQkJcmV0dXJuIHRlbXAxOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShmaW5hbCBGaWxlIGRpcmVjdG9yeSkgew0KLQkJaWYgKGRpcmVjdG9yeSA9PSBudWxsKSB7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlmb3IgKEZpbGUgZiA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgew0KLQkJCWYuZGVsZXRlKCk7DQotCQl9DQotCQlkaXJlY3RvcnkuZGVsZXRlKCk7DQotCX0NCi0NCi0JcHVibGljIElGaWxlW10gZ2V0RmlsZXNCeUV4dGVuc2lvbihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZXh0ZW5zaW9uKQ0KLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShleHRlbnNpb24sICJleHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJQXJyYXlMaXN0PElGaWxlPiBmb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmlsZT4oKTsNCi0NCi0JCWdldEZpbGVzQnlFeHRlbnNpb24oZm91bmRGaWxlcywgcHJvamVjdC5tZW1iZXJzKCksIGV4dGVuc2lvbik7DQotDQotCQlyZXR1cm4gZm91bmRGaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmb3VuZEZpbGVzLnNpemUoKV0pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBnZXRGaWxlc0J5RXh0ZW5zaW9uKEFycmF5TGlzdDxJRmlsZT4gZm91bmRGaWxlcywNCi0JCQlJUmVzb3VyY2VbXSBjdXJyZW50UmVzb3VyY2VzLCBTdHJpbmcgZXh0ZW5zaW9uKQ0KLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWZvciAoaW50IGlpID0gMDsgaWkgPCBjdXJyZW50UmVzb3VyY2VzLmxlbmd0aDsgaWkrKykgew0KLQkJCWlmIChjdXJyZW50UmVzb3VyY2VzW2lpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgew0KLQkJCQlnZXRGaWxlc0J5RXh0ZW5zaW9uKGZvdW5kRmlsZXMsDQotCQkJCQkJKChJRm9sZGVyKSBjdXJyZW50UmVzb3VyY2VzW2lpXSkubWVtYmVycygpLCBleHRlbnNpb24pOw0KLQkJCX0gZWxzZSBpZiAoY3VycmVudFJlc291cmNlc1tpaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFDQotCQkJCQkmJiBleHRlbnNpb24NCi0JCQkJCQkJLmVxdWFscyhjdXJyZW50UmVzb3VyY2VzW2lpXS5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7DQotCQkJCWZvdW5kRmlsZXMuYWRkKChJRmlsZSkgY3VycmVudFJlc291cmNlc1tpaV0pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZUZvckxvY2F0aW9uKElQYXRoIGxvY2F0aW9uKSB7DQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oDQotCQkJCWxvY2F0aW9uKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVdvcmtiZW5jaFBhZ2UoKSB7DQotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotDQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQ0KLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOw0KLQl9DQotDQotCXB1YmxpYyBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGN1LCAiY3UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3IgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKGN1DQotCQkJCS5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWZpbmFsIElXb3JrYmVuY2hQYWdlIHdiUGFnZSA9IGdldEFjdGl2ZVdvcmtiZW5jaFBhZ2UoKTsNCi0JCWlmICh3YlBhZ2UgPT0gbnVsbCkgew0KLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PigwKTsNCi0JCX0NCi0NCi0JCXJldHVybiBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoZWRpdG9yRGVzY3IsIHdiUGFnZSwgY3UpOw0KLQl9DQotDQotCXByaXZhdGUgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5Q29tcGlsYXRpb25Vbml0KA0KLQkJCWZpbmFsIElFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IsDQotCQkJZmluYWwgSVdvcmtiZW5jaFBhZ2UgcGFnZSwgZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgew0KLQkJTGlzdDxJRWRpdG9yUGFydD4gZWRpdG9yUGFydFJldHVybmVkID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsNCi0NCi0JCWlmIChlZGl0b3JEZXNjcmlwdG9yICE9IG51bGwgJiYgcGFnZSAhPSBudWxsKSB7DQotCQkJZm9yIChJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZmVyZWNlIDogcGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkpIHsNCi0JCQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IGVkaXRvclJlZmVyZWNlLmdldEVkaXRvcih0cnVlKTsNCi0JCQkJaWYgKGlzRWRpdG9yQXBwbGljYWJsZUZvckN1KGVkaXRvclBhcnQsIGN1KSkgew0KLQkJCQkJZWRpdG9yUGFydFJldHVybmVkLmFkZChlZGl0b3JQYXJ0KTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBlZGl0b3JQYXJ0UmV0dXJuZWQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGlzRWRpdG9yQXBwbGljYWJsZUZvckN1KGZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvciwNCi0JCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7DQotCQlpZiAoZWRpdG9yID09IG51bGwpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotDQotCQlpZiAoIShlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpDQotCQkJCXx8ICEoY3UuZ2V0UmVzb3VyY2UoKSBpbnN0YW5jZW9mIElGaWxlKSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWZpbmFsIElGaWxlIGN1RmlsZSA9IChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKTsNCi0JCWZpbmFsIElGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yDQotCQkJCS5nZXRFZGl0b3JJbnB1dCgpOw0KLQ0KLQkJcmV0dXJuIGN1RmlsZS5lcXVhbHMoZWRpdG9ySW5wdXQuZ2V0RmlsZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0ZpbGVEaXNwbGF5ZWRJbkRpcnR5RWRpdG9yKA0KLQkJCWZpbmFsIExpc3Q8SUVkaXRvclBhcnQ+IGRpc3BsYXlpbmdFZGl0b3JzKSB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZGlzcGxheWluZ0VkaXRvcnMsICJkaXNwbGF5aW5nRWRpdG9ycyIpOyAvLyROT04tTkxTLTEkDQotCQlmb3IgKElFZGl0b3JQYXJ0IGVkaXRvciA6IGRpc3BsYXlpbmdFZGl0b3JzKSB7DQotCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZWFkcyBmaWxlIGNvbnRlbnQgYXMgdGV4dCBhbmQgcmV0dXJucyB7QGxpbmsgU3RyaW5nfQ0KLQkgKiANCi0JICogQHBhcmFtIHNvdXJjZUZpbGUNCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiBmaWxlDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnQoZmluYWwgRmlsZSBzb3VyY2VGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJZmluYWwgRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKHNvdXJjZUZpbGUpOw0KLQkJZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCi0NCi0JCXRyeSB7DQotCQkJZmluYWwgY2hhcltdIGJ1ZmYgPSBuZXcgY2hhclsxMDI0XTsNCi0JCQlmb3IgKGludCBjbnQgPSAwOyAoY250ID0gZnIucmVhZChidWZmKSkgPiAtMTspIHsNCi0JCQkJYnVpbGRlci5hcHBlbmQoYnVmZiwgMCwgY250KTsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWZyLmNsb3NlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gYnVpbGRlci50b1N0cmluZygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB1bml0LA0KLQkJCWZpbmFsIFN0cmluZyBjb250ZW50LCBmaW5hbCBib29sZWFuIGZvcmNlLA0KLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0odW5pdCwgInVuaXQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGNvbnRlbnQsICJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCXVuaXQuYmVjb21lV29ya2luZ0NvcHkobW9uaXRvcik7DQotCQl0cnkgew0KLQkJCXVuaXQuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoY29udGVudCk7DQotCQkJdW5pdC5jb21taXRXb3JraW5nQ29weShmb3JjZSwgbW9uaXRvcik7DQotCQl9IGZpbmFsbHkgew0KLQkJCXVuaXQuZGlzY2FyZFdvcmtpbmdDb3B5KCk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudEFuZFNhdmVEaXJ0eUVkaXRvcnMoDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBmaW5hbCBTdHJpbmcgY29udGVudCwNCi0JCQlmaW5hbCBib29sZWFuIGZvcmNlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7DQotCQlzZXRDb21waWxhdGlvblVuaXRDb250ZW50KHVuaXQsIGNvbnRlbnQsIGZvcmNlLCBtb25pdG9yKTsNCi0JCWlmIChpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IodW5pdCkpIHsNCi0JCQlzYXZlRWRpdG9yKHVuaXQpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0lGaWxlVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL0lGaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZkZmEwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9JRmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7DQotDQotLyoqDQotICogSW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBjb21tb24gdXRpbGllcyBmb3IgZmlsZSBtYW5pcHVsYXRpb24NCi0gKiANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVVdGlscyB7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZXMgdGhlIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlIGZpbGUgc3BlY2ZpZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZQ0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKQ0KLQkgKiBAcmV0dXJuIEN1cnJlbnQgb3BlbmVkIGVkaXRvcnMgb2YgdGhlIGZpbGUgc3BlY2lmaWVkIG9yIGFuIGVtcHR5IGxpc3QgaWYgc3VjaCBhcmUgbm90IG9wZW5lZA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0DQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgTGlzdDxJRWRpdG9yUGFydD4gZ2V0RWRpdG9yc0J5RmlsZUxvY2F0aW9uKA0KLQkJCWZpbmFsIFN0cmluZyBmaWxlTG9jYXRpb24pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpbGUgc3BlY2lmaWVkIGlzIGRpc3BsYXllZCB3aXRoaW4gYW4gZWRpdG9yIHdoaWNoDQotCSAqIGhhcyBhIGRpcnR5IHN0YXRlLg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkNCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIGlzIGRpcnR5DQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcigNCi0JCQlmaW5hbCBTdHJpbmcgZmlsZUxvY2F0aW9uKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGVMb2NhdGlvbg0KLQkgKiAgICAgICAgICAgIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUNCi0JICogQHNlZSBJUmVzb3VyY2UjZ2V0TG9jYXRpb24oKSN0b09TU3RyaW5nKCkNCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXMNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvcg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZUVkaXRvcihTdHJpbmcgZmlsZUxvY2F0aW9uKQ0KLQkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTYXZlcyB0aGUgZGlydHkgc3RhdGUgZWRpdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZUxvY2F0aW9uDQotCSAqICAgICAgICAgICAgQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZQ0KLQkgKiBAc2VlIElSZXNvdXJjZSNnZXRMb2NhdGlvbigpI3RvT1NTdHJpbmcoKQ0KLQkgKiBAcGFyYW0gbW9uaXRvcg0KLQkgKiAgICAgICAgICAgIFByb2dyZXNzIG1vbml0b3INCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGRvZXMgbm90IGV4aXMNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvcg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZUVkaXRvcihTdHJpbmcgZmlsZUxvY2F0aW9uLA0KLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgZGlydHkgZWRpdG9ycw0KLQkgKiANCi0JICogQHJldHVybiBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgZGlydHkgZWRpdG9ycw0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGdldERpcnR5RWRpdG9ycygpOw0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgY29tcGlsYXRpb24gdW5pdHMgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQNCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSwgZS5nLg0KLQkgKiAgICAgICAgICAgIDxjb2RlPkM6XFxkaXIxXFxkaXIyXFxmaWxlLm5hbWU8L2NvZGU+DQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIHNwZWNpZmllZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIHNwZWNpZmllZCBpcyBub3QgYSBjb21waWxhdGlvbiB1bml0DQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBmaWxlTG9jYXRpb24gaXMgbnVsbA0KLQkgKiBAcmV0dXJuIFRoZSBjb21waWxhdGlvbiB1bml0czsgY2Fubm90IGJlIG51bGwNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PElDb21waWxhdGlvblVuaXQ+IGdldENvbXBpbGF0aW9uVW5pdHMoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSBwcm9qZWN0IHVuaXQgZm9yIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQNCi0JICogDQotCSAqIEBwYXJhbSBmaWxlTG9jYXRpb24NCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSwgZS5nLg0KLQkgKiAgICAgICAgICAgIDxjb2RlPkM6XFxkaXIxXFxkaXIyXFxmaWxlLm5hbWU8L2NvZGU+DQotCSAqIEBzZWUgSVJlc291cmNlI2dldExvY2F0aW9uKCkjdG9PU1N0cmluZygpDQotCSAqIA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBmaWxlIHNwZWNpZmllZCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHdvcmtzcGFjZQ0KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gZmlsZUxvY2F0aW9uIGlzIG51bGwNCi0JICogQHJldHVybiBUaGUgY29tcGlsYXRpb24gdW5pdHM7IGNhbm5vdCBiZSBudWxsDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgSVByb2plY3QgZ2V0UHJvamVjdFVuaXQoDQotCQkJZmluYWwgU3RyaW5nIGZpbGVMb2NhdGlvbikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIENvbnZlcnRzIGEgU3RyaW5nIHRvIGEgVVJMLCBhc3N1bWluZyAnZmlsZTonIGFzIGEgZGVmYXVsdCBzY2hlbWUuDQotCSAqIA0KLQkgKiBAcGFyYW0gYmFzZQ0KLQkgKiBAcGFyYW0gcGF0aA0KLQkgKiANCi0JICogQHJldHVybg0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiwNCi0JICogICAgICAgICAgICAgaWYgdGhlIFN0cmluZyBpcyBuZWl0aGVyIGEgdmFsaWQgVVJMLCBub3IgYSB2YWxpZCBmaWxlbmFtZS4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgVVJMIGZpbGVPclVSTFRvVVJMKGZpbmFsIFVSTCBiYXNlLCBmaW5hbCBTdHJpbmcgcGF0aCkNCi0JCQl0aHJvd3MgSU9FeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBpbiB0aGUgT1MgdGVtcCBmb2xkZXINCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGRpcmVjdG9yeQ0KLQkgKi8NCi0JcHVibGljIEZpbGUgY3JlYXRlVGVtcERpcmVjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBjb250ZW50DQotCSAqIA0KLQkgKiBwYXJhbSBkaXJlY3RvcnkNCi0JICovDQotCXB1YmxpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShmaW5hbCBGaWxlIGRpcmVjdG9yeSk7DQotDQotCS8qKg0KLQkgKiBHZXRzIGFsbCB0aGUgZmlsZXMgd2l0aCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHdpdGhpbiBhIHByb2plY3QuDQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvamVjdCAtDQotCSAqICAgICAgICAgICAgdG8gYmUgc2VhcmNoZWQNCi0JICogQHBhcmFtIGV4dGVuc2lvbiAtDQotCSAqICAgICAgICAgICAgdHlwZXMgb2YgZmlsZXMgb2YgaW50ZXJlc3QNCi0JICovDQotCXB1YmxpYyBJRmlsZVtdIGdldEZpbGVzQnlFeHRlbnNpb24oSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGV4dGVuc2lvbikNCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlcyBhIGxpc3Qgb2YgZWRpdG9ycyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWluZyB0aGUgY29tcGlsYXRpb24NCi0JICogdW5pdCBzcGVjaWZpZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gY3UNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdDsgbXVzdCBub3QgYmUgbnVsbA0KLQkgKiBAcmV0dXJuIEN1cnJlbnQgZWRpdG9ycyBsaXN0IG9yIGFuIGVtcHR5IGxpc3QgaW4gY2FzZSB0aGVyZSBhcmUgbm90DQotCSAqICAgICAgICAgZWRpdG9ycyBkaXNwbGF5aW5nIHRoZSBmaWxlIHNwZWNpZmllZA0KLQkgKiANCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSA8Y29kZT5jdTwvY29kZT4gcGFyYW1ldGVyIGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0PElFZGl0b3JQYXJ0PiBnZXRFZGl0b3JzQnlDb21waWxhdGlvblVuaXQoDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSk7DQotDQotCS8qKg0KLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkIGlzIGRpc3BsYXllZCB3aXRoaW4gYW4NCi0JICogZWRpdG9yIHdoaWNoIGhhcyBhIGRpcnR5IHN0YXRlLg0KLQkgKiANCi0JICogQHBhcmFtIHVuaXQNCi0JICogICAgICAgICAgICBUaGUgY29tcGlsYXRpb24gdW5pdA0KLQkgKiANCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGRpcnR5DQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NvbXBpbGF0aW9uVW5pdERpc3BsYXllZEluRGlydHlFZGl0b3IoDQotCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB1bml0KTsNCi0NCi0JLyoqDQotCSAqIFNhdmVzIGFsbCB0aGUgZGlydHkgc3RhdGUgZWRpdG9ycyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWluZyB0aGUNCi0JICogY29tcGlsYXRpb24gdW5pdCBzcGVjaWZpZWQNCi0JICogDQotCSAqIEBwYXJhbSBjdQ0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0DQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgUHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvcg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZUVkaXRvcihJQ29tcGlsYXRpb25Vbml0IGN1LA0KLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotDQotCS8qKg0KLQkgKiBTYXZlcyBhbGwgdGhlIGRpcnR5IHN0YXRlIGVkaXRvcnMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXlpbmcgdGhlDQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgc3BlY2lmaWVkDQotCSAqIA0KLQkgKiBAcGFyYW0gY3UNCi0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdA0KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgZG9lcyBub3QgZXhpc3QNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgZmlsZSBpcyBub3QgZGlzcGxheWVkIGJ5IGFuIGVkaXRvcg0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZUVkaXRvcihJQ29tcGlsYXRpb25Vbml0IGN1KTsNCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIGEgZmlsZSBpbnN0YW5jZSBmb3IgdGhlIGxvY2F0aW9uIHNwZWNpZmllZC4gVGhpcyBtZXRob2QgaXMgYQ0KLQkgKiBjb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnZva2luZw0KLQkgKiA8Y29kZT5SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihsb2NhdGlvbik8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gbG9jYXRpb24NCi0JICogICAgICAgICAgICB0aGUgZmlsZSBsb2NhdGlvbjsgbXVzdCBiZSBhYnNvbHV0ZQ0KLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSwgb3IgbnVsbCBpZiBub25lDQotCSAqIEBzZWUgSVdvcmtzcGFjZVJvb3QjZ2V0RmlsZUZvckxvY2F0aW9uKElQYXRoKQ0KLQkgKi8NCi0JcHVibGljIElGaWxlIGdldEZpbGVGb3JMb2NhdGlvbihJUGF0aCBsb2NhdGlvbik7DQotDQotCS8qKg0KLQkgKiBSZWFkcyBmaWxlIGNvbnRlbnQgYXMgdGV4dCBhbmQgcmV0dXJucyB7QGxpbmsgU3RyaW5nfQ0KLQkgKiANCi0JICogQHBhcmFtIHNvdXJjZUZpbGUNCi0JICogQHJldHVybiB0aGUgY29udGVudCBvZiBmaWxlDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnQoZmluYWwgRmlsZSBzb3VyY2VGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZCB3aXRoIHRoZQ0KLQkgKiA8Y29kZT5jb250ZW50PC9jb2RlPiBwcm92aWRlZC4gVGhlcmUgaXMgbm8gdmFsaWRhdGlvbiBvZiB0aGUgY29udGVudA0KLQkgKiANCi0JICogQHBhcmFtIGNVbml0DQotCSAqICAgICAgICAgICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIE11c3Qgbm90IGJlIG51bGwuIElmIHRoZSBjb21waWxhdGlvbg0KLQkgKiAgICAgICAgICAgIHVuaXQgZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZA0KLQkgKiBAcGFyYW0gY29udGVudA0KLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHRvIGJlIHNldC4gTXVzdCBub3QgYmUgbnVsbA0KLQkgKiBAcGFyYW0gZm9yY2UNCi0JICogICAgICAgICAgICBhIGZsYWcgdG8gaGFuZGxlIHRoZSBjYXNlcyB3aGVuIHRoZSBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwNCi0JICogICAgICAgICAgICByZXNvdXJjZSBoYXZlIGNoYW5nZWQgc2luY2UgdGhpcyB3b3JraW5nIGNvcHkgd2FzIGNyZWF0ZWQNCi0JICogQHBhcmFtIG1vbml0b3INCi0JICogICAgICAgICAgICB0aGUgbW9uaXRvciB0byByZXBvcnQgcHJvZ3Jlc3MgdG8gb3IgbnVsbCBpZiBubyBwcm9ncmVzcw0KLQkgKiAgICAgICAgICAgIG1vbml0b3JpbmcgaXMgcmVxdWlyZWQNCi0JICogDQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggc2V0dGluZyBjb21waWxhdGlvbiB1bml0IGNvbnRlbnQNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2JlY29tZVdvcmtpbmdDb3B5KElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNjb21taXRXb3JraW5nQ29weShib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjZGlzY2FyZFdvcmtpbmdDb3B5KCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCBjVW5pdCwNCi0JCQlTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHNwZWNpZmllZCB3aXRoIHRoZQ0KLQkgKiA8Y29kZT5jb250ZW50PC9jb2RlPiBwcm92aWRlZCBhbmQgc2F2ZXMgdGhlIGRpcnR5IGVkaXRvcnMgaWYgYW55IHdoaWNoDQotCSAqIGRpc3BsYXkgdGhlIGNvbXBpbGF0aW9uIHVuaXQuIFRoZXJlIGlzIG5vIHZhbGlkYXRpb24gb2YgdGhlIGNvbnRlbnQNCi0JICogDQotCSAqIEBwYXJhbSBjVW5pdA0KLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0LiBNdXN0IG5vdCBiZSBudWxsLiBJZiB0aGUgY29tcGlsYXRpb24NCi0JICogICAgICAgICAgICB1bml0IGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQNCi0JICogQHBhcmFtIGNvbnRlbnQNCi0JICogICAgICAgICAgICB0aGUgY29udGVudCB0byBiZSBzZXQuIE11c3Qgbm90IGJlIG51bGwNCi0JICogQHBhcmFtIGZvcmNlDQotCSAqICAgICAgICAgICAgYSBmbGFnIHRvIGhhbmRsZSB0aGUgY2FzZXMgd2hlbiB0aGUgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsDQotCSAqICAgICAgICAgICAgcmVzb3VyY2UgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoaXMgd29ya2luZyBjb3B5IHdhcyBjcmVhdGVkDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgdGhlIG1vbml0b3IgdG8gcmVwb3J0IHByb2dyZXNzIHRvIG9yIG51bGwgaWYgbm8gcHJvZ3Jlc3MNCi0JICogICAgICAgICAgICBtb25pdG9yaW5nIGlzIHJlcXVpcmVkDQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHNldHRpbmcgY29tcGlsYXRpb24gdW5pdCBjb250ZW50DQotCSAqIEBzZWUgSUNvbXBpbGF0aW9uVW5pdCNiZWNvbWVXb3JraW5nQ29weShJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElDb21waWxhdGlvblVuaXQjY29tbWl0V29ya2luZ0NvcHkoYm9vbGVhbiwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNlZSBJQ29tcGlsYXRpb25Vbml0I2Rpc2NhcmRXb3JraW5nQ29weSgpDQotCSAqIEBzZWUgSUZpbGVVdGlscyNzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQsIFN0cmluZywNCi0JICogICAgICBib29sZWFuLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAc2VlIElGaWxlVXRpbHMjaXNGaWxlRGlzcGxheWVkSW5EaXJ0eUVkaXRvcihTdHJpbmcpDQotCSAqIEBzZWUgSUZpbGVVdGlscyNzYXZlRWRpdG9yKElDb21waWxhdGlvblVuaXQsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycygNCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNVbml0LCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwNCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1Byb2plY3RNYW5hZ2VtZW50VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1Byb2plY3RNYW5hZ2VtZW50VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGY4ODBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Jlc291cmNlcy9Qcm9qZWN0TWFuYWdlbWVudFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb24uTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuZmFjZXRzLkZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5mYWNldHMuSUZhY2V0VXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC50ZXh0LkpheFdzVXRpbE1lc3NhZ2VzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5JTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMubG9nZ2luZy5Mb2dnZXI7DQotDQotDQotLyoqDQotICogVXRpbGl0eSB0aGF0IHByb3ZpZGVzIHVzZWZ1bCBwcm9qZWN0IG1hbmFnZW1lbnQgc2VydmljZXMNCi0gKiANCi0gKiBAYXV0aG9yIEpvZXJnIERlaG1lbA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFByb2plY3RNYW5hZ2VtZW50VXRpbHMNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElMb2dnZXIgbG9nZ2VyID0gbmV3IExvZ2dlcigpOw0KLQkNCi0JLyoqDQotCSAqIFByb3ZpZGVzIHRoZSBtZXRhLWluZiBmb2xkZXIgb2YgYSBFSkIgcHJvamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBwUHJvamVjdE5hbWUNCi0JICogICAgICAgICAgICBwcm9qZWN0IG5hbWUNCi0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugb2YgdGhlIG1ldGEtaW5mIGZvbGRlcg0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5IHN0cmluZywgdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUsIG9yIHRoZSBwcm9qZWN0DQotCSAqICAgICAgICAgICAgIGlzIG5vdCBhbiBlamIgcHJvamVjdA0KLQkgKiBAdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBlaXRoZXIgdGhlIHByb2plY3QgZG9lc24ndCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIG9yIGl0IGRvZXNuJ3QgY29udGFpbiBhIG1ldGEtaW5mIGZvbGRlcg0KLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBlcnJvciBvY2N1cmVkIHdoaWxlIGFjY2Vzc2luZyBqYXZhIG1vZGVsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElGb2xkZXIgZmluZE1ldGFJbmZGb2xkZXIoZmluYWwgU3RyaW5nIHBQcm9qZWN0TmFtZSkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgbWV0YUluZk5hbWUgPSAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkDQotCQlmaW5hbCBTdHJpbmcgZWpiTW9kdWxlTmFtZSA9ICJlamJNb2R1bGUiOyAvLyROT04tTkxTLTEkDQotDQotCQlpZiAoIWlzRWpiM1Byb2plY3QocFByb2plY3ROYW1lKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9qZWN0ICIgKyBwUHJvamVjdE5hbWUgKyAiIGlzIG5vdCBhbiBFSkIgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0NCi0NCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0QnlOYW1lKHBQcm9qZWN0TmFtZSk7DQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsNCi0JCUlQYWNrYWdlRnJhZ21lbnQgZWpiTW9kdWxlUGtnRnJhZ21lbnQgPSBudWxsOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBmcmFnbWVudFJvb3QgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKQ0KLQkJCXsNCi0JCQkJaWYgKGZyYWdtZW50Um9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UgJiYgZnJhZ21lbnRSb290LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVqYk1vZHVsZU5hbWUpKQ0KLQkJCQl7DQotCQkJCQllamJNb2R1bGVQa2dGcmFnbWVudCA9IGZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQobWV0YUluZk5hbWUpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCXZlcmlmeU1ldGFJbmZGb2xkZXIoZWpiTW9kdWxlUGtnRnJhZ21lbnQsIHBQcm9qZWN0TmFtZSk7DQotCQkJcmV0dXJuIChJRm9sZGVyKSBlamJNb2R1bGVQa2dGcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsNCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmVyaWZ5TWV0YUluZkZvbGRlcihJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50LCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24NCi0Jew0KLQkJaWYgKGZyYWdtZW50ID09IG51bGwpDQotCQl7DQotCQkJZmluYWwgU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KCJwcm9qZWN0IHswfSBkb2VzIG5vdCBoYXZlIGEgTUVUQS1JTkYgZm9sZGVyIiwgbmV3IE9iamVjdFtdIHsgcHJvamVjdE5hbWUgfSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlmaW5hbCBTdHJpbmcgbG9jYWxpemVkTXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSmF4V3NVdGlsTWVzc2FnZXMuUHJvamVjdE1hbmFnZW1lbnRVdGlsc19Qcm9qZWN0SGFzTm9NZXRhSW5mRm9sZGVyTXNnLCBuZXcgT2JqZWN0W10geyBwcm9qZWN0TmFtZSB9KTsNCi0JCQl0aHJvdyBuZXcgTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uKG1zZywgbG9jYWxpemVkTXNnKTsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZyYWdtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOw0KLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuIQ0KLQkJCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikpDQotCQkJew0KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVzb3VyY2UgIiArIHJlc291cmNlLmdldE5hbWUoKSArICIgaXMgbm90IGEgZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlci5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVjayB3aGV0aGVyIGEgcHJvamVjdCBpcyBhbiBlamIgMyBwcm9qZWN0DQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUNCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdDsgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IHN0cmluZw0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSBlamIgMyBwcm9qZWN0OyBmYWxzZSBvdGhlcndpc2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHkgc3RyaW5nDQotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gdGhlIHByb2plY3QgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFjY2Vzc2libGUNCi0JICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWNjZXNzaW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFamIzUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUpDQotCXsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0QnlOYW1lKHByb2plY3ROYW1lKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCXJldHVybiBmYWNldFV0aWxzKCkuaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBJRmFjZXRVdGlscy5FSkJfMzBfRkFDRVRfVkVSU0lPTiwgSUZhY2V0VXRpbHMuRUpCXzMwX0ZBQ0VUX0lELCB0cnVlKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2sgd2hldGhlciBhIHByb2plY3QgaXMgYW4gd2ViIDIuNSBwcm9qZWN0DQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUNCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdDsgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5IHN0cmluZw0KLQkgKiBAcmV0dXJuIHRydWUgaW4gY2FzZSB0aGUgcHJvamVjdCBzcGVjaWZpZWQgaXMgYSB3ZWIgMi41IHByb2plY3Q7IGZhbHNlIG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IG5hbWUgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+LCBlbXB0eSBzdHJpbmcNCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBhY2Nlc3NpbmcgdGhlIHByb2plY3QgbWV0YWRhdGENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYjI1UHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUpDQotCXsNCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0QnlOYW1lKHByb2plY3ROYW1lKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCXJldHVybiBmYWNldFV0aWxzKCkuaGFzRmFjZXRXaXRoVmVyc2lvbihwcm9qZWN0LCBJRmFjZXRVdGlscy5XRUJfMjVfRkFDRVRfVkVSU0lPTiwgSUZhY2V0VXRpbHMuV0VCXzI1X0ZBQ0VUX0lELCB0cnVlKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIHByb2plY3QgaW5zdGFuY2UgYnkgcHJvamVjdCBuYW1lDQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUNCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCBuYW1lDQotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgaW5zdGFuY2UNCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBpcyBudWxsIG9yIGVtcHR5IHN0cmluZw0KLQkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIHRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhY2Nlc3NpYmxlDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0QnlOYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkNCi0Jew0KLQkJaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgcHJvamVjdE5hbWUubGVuZ3RoKCkgPT0gMCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb2plY3QgbmFtZTogIiArIHByb2plY3ROYW1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7DQotCQlpZiAocHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2plY3QgaXMgbm90IGFjY2Vzc2libGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHByb2plY3Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IGluc3RhbmNlDQotCSAqIA0KLQkgKiBAcGFyYW0gcHJvamVjdA0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IGFzIGVjbGlwc2UgcmVzb3VyY2UNCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IGluc3RhbmNlDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQotCSAqICAgICAgICAgICAgIHdoZW4gPGNvZGU+cHJvamVjdDwvY29kZT4gbnVsbCBvciB0aGUgcHJvamVjdCBpcyBub3QgYWNjZXNzaWJsZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkNCi0Jew0KLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9qZWN0IGlzIG5vdCBhY2Nlc3NpYmxlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZWZyZXNoIHRoZSByZXNvdXJjZSBzcGVjaWZpZWQuIFJlZnJlc2ggZGVwdGggdXNlZCBpcyB6ZXJvDQotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UgdG8gYmUgcmVmcmVzaGVkDQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiANCi0JICogQHNlZSBJUmVzb3VyY2UjREVQVEhfWkVSTw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uDQotCXsNCi0JCWlmKHJlc291cmNlID09IG51bGwpDQotCQl7DQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlZnJlc2hlcyB0aGUgcHJvamVjdCB0aGUgcmVzb3VyY2Ugc3BlY2lmaWVkIGJlbG9uZ3MgdG8uIFJlZnJlc2ggZGVwdGggdXNlZCBpcyBpbmZpbml0ZS4NCi0JICogQHBhcmFtIHRoZSByZXNvdXJjZSB3aGljaCBwcm9qZWN0IGlzIHRvIGJlIHJlZnJlc2hlZA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gdGhlIHJlc291cmNlIHNwZWNpZmllZCBpcyBhIHdvcmtzcGFjZSByb290DQotCSAqIEBzZWUgSVJlc291cmNlI0RFUFRIX0lORklOSVRFDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFByb2plY3RCeVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInJlc291cmNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPcGVyYXRpb24gaXMgbm90IGRlZmluZWQgZm9yIHdvcmtzcGFjZSByb290cyIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQkNCi0JCXJlc291cmNlLmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSUZhY2V0VXRpbHMgZmFjZXRVdGlscygpDQotCXsNCi0JCXJldHVybiBuZXcgRmFjZXRVdGlscygpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwYzk2MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KLQ0KLS8qKg0KLSAqIEFkYXB0ZXIgY2xhc3MgdGhhdCB1c2VzIGEgU3RyaW5nUmVhZGVyIHRvIG9yZ2FuaXplIGFuIElucHV0U3RyZWFtDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGV4dGVuZHMgSW5wdXRTdHJlYW0NCi17DQotCXByaXZhdGUgU3RyaW5nUmVhZGVyIHJlYWRlcjsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqIA0KLQkgKiBAcGFyYW0gc3RyaW5nDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiA8Y29kZT5zdHJpbmc8L2NvZGU+IGlzIG51bGwNCi0JICovDQotCXB1YmxpYyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoU3RyaW5nIHN0cmluZykNCi0Jew0KLQkJaWYgKHN0cmluZyA9PSBudWxsKQ0KLQkJew0KLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigic3RyaW5nIik7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCXJldHVybiByZWFkZXIucmVhZCgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM1OWEzYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODI2NDYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGQ2OTBmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+DQotPGhlYWQ+DQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkVOLVVTIj4NCi08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4NCi0gDQotPHA+U2VwdGVtYmVyIDA2LCAyMDA5PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgDQotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgDQotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyANCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudA0KLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Jvb2suY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2Jvb2suY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkN2UyYjU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotc3Bhbi5jb250cm9sIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ubmFtZSB7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5jb2RlIHsKLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLX0KLQotcC5uYXZfZm9vdGVyIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotcC5uYXZfZm9vdGVyIGEgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjYTRlYTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIGNoZWF0c2hlZXRzLyxcCi0gICAgICAgICAgICAgICBnZXR0aW5nc3RhcnRlZC8sXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0YXNrcy8sXAotICAgICAgICAgICAgICAgdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sLFwKLSAgICAgICAgICAgICAgIHRvY3Rhc2tzLnhtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZS8sXAotICAgICAgICAgICAgICAgbGVnYWwuaHRtbCxcCi0gICAgICAgICAgICAgICB0b2NyZWZlcmVuY2UueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvYm90dG9tVXAtY3hmLWNvbXBvc2l0ZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvYm90dG9tVXAtY3hmLWNvbXBvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJhYmUxMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2JvdHRvbVVwLWN4Zi1jb21wb3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb3NpdGVDaGVhdHNoZWV0IG5hbWU9IkNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGIj4KLSAgIDx0YXNrR3JvdXAga2luZD0ic2V0IiBuYW1lPSJDcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgPGludHJvPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBpbmRpdmlkdWFsIHN0ZXBzIHRvIHNldHVwIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUsIGNyZWF0ZSBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciwgIGEgRHluYW1pYyBXZWIgUHJvamVjdCBlbmFibGVkIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCAgYW5kIGNyZWF0ZSBhIEpBWC1XUyBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuLCBkZXBsb3kgaXQgdG8gQXBhY2hlIFRvbWNhdCBhbmQgdGVzdCBpdCB1c2luZyB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1UbyBhc3Npc3QgeW91IGFsb25nIHRoZSB3YXksIHdpemFyZHMgYW5kIGNvbW1hbmRzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB5b3UgdG8gbGF1bmNoIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2ludHJvPgotICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGp1c3QgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lLCBjcmVhdGVkIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLCBhIER5bmFtaWMgV2ViIFByb2plY3QgZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcGVtbnQgYW5kIGEgSkFYLVdTIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gYW5kIHRoZW4gZGVwbG95ZWQgdGhhdCBzZXJ2aWNlIHRvIEFwYWNoZSBUb21jYXQgYW5kIHRlc3RlZCBpdCB3aXRoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIuCi0gICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBSdW50aW1lIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaC4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoIHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iSW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyLgotPGJyLz4KLTxici8+Ci1JZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGluc3RhbGxlZCBhbmQgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtdG9tY2F0LXNlcnZlci54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBjcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50LgotPGJyLz4KLTxici8+Ci1JZiB5b3UgYWxyZWFkeSBoYXZlIGEgRHluYW1pYyBXZWIgUHJvamVjdCAgZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBjcmVhdGVkIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlZCBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLWN4Zi1wcm9qZWN0LnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iQ3JlYXRlIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGIiBza2lwPSJmYWxzZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIEpBWC1XUyBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiAgYmVhbiB1c2luZyB0aGUgQXBhY2hlIENYRiBydW50aW1lLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBpY3JlYXRlZCBhIEpBWC1XUyBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgIDwvdGFza0dyb3VwPgotPC9jb21wb3NpdGVDaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NvbmZpZ3VyZS1jeGYtcnVudGltZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzMwMDg1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNoZWF0c2hlZXQgdGl0bGU9IkNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBSdW50aW1lIj4NCi0gICA8aW50cm8NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2guCi0gICAgICAgICAgICA8YnIvPgotICAgICAgICAgICAgPGJyLz4KLUlmIHlvdSBuZWVkIGhlbHAgYXQgYW55IHN0ZXAsIGNsaWNrIHRoZSBoZWxwIGJ1dHRvbiBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciAoPykuDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICA8L2ludHJvPg0KLSAgIDxpdGVtDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCINCi0gICAgICAgICBza2lwPSJ0cnVlIg0KLSAgICAgICAgIHRpdGxlPSJEb3dubG9hZCBhbmQgaW5zdGFsbCB0aGUgQXBhY2hlIENYRiBydW50aW1lIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBDWEYgcnVudGltZSB2ZXJzaW9uIDIuMS54IG9yIDIuMi54IGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOiBodHRwOi8vY3hmLmFwYWNoZS5vcmcvLiBTZWxlY3RpbmcgIHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiBiZWxvdyB3aWxsIG9wZW4gYSB3ZWIgYnJvd3NlciBhdCB0aGF0IGxvY2F0aW9uLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5vcGVuQnJvd3Nlcih1cmw9aHR0cDovL2N4Zi5hcGFjaGUub3JnLykiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCINCi0gICAgICAgICBza2lwPSJ0cnVlIg0KLSAgICAgICAgIHRpdGxlPSJDb25maWd1cmUgQXBhY2hlIENYRiBpbiB0aGUgd29ya2JlbmNoIg0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIEFwYWNoZSBDWEYgbXVzdCBiZSBjb25maWd1cmVkIGluIHRoZSB3b3JrYmVuY2ggYmVmb3JlIHVzaW5nIGl0IHRvIGNyZWF0ZSBKQVgtV1MgV2ViIHNlcnZpY2VzLgotPGJyLz4KLTxici8+Ci1TZWxlY3QgPGI+V2luZG93LSZndDtQcmVmZXJlbmNlczwvYj4gZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlIDxiPldlYiBTZXJ2aWNlczwvYj4gb3V0bGluZSB0cmVlIG5vZGUgd2l0aGluIHRoZSByZXN1bHRpbmcgZGlhbG9nLCBhbmQgY2hvb3NlIDxiPkNYRiAyLnggUHJlZmVyZW5jZXM8L2I+LiBTZWxlY3QgdGhlICZxdW90O0NsaWNrIHRvIHBlcmZvcm0mcXVvdDsgYnV0dG9uIHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4KLTxici8+Ci08YnIvPgotQnJvd3NlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB5b3UgaW5zdGFsbGVkIEFwYWNoZSAgQ1hGIGFuZCB0aGVuIGNsaWNrIDxiPk9LPC9iPiBpbiB0aGUgUHJlZmVyZW5jZXMgZGlhbG9nLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkud2luZG93LnByZWZlcmVuY2VzKHByZWZlcmVuY2VQYWdlSWQ9b3JnLmVjbGlwc2UuanN0LndzLmN4Zi51aS5DWEZSdW50aW1lUHJlZmVyZW5jZXNQYWdlKSIvPg0KLSAgIDwvaXRlbT4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sIg0KLSAgICAgICAgIHNraXA9InRydWUiDQotICAgICAgICAgdGl0bGU9IlNldCBBcGFjaGUgQ1hGIGFzIHRoZSBkZWZhdWx0IHJ1bnRpbWUiDQotICAgICAgICAgZGlhbG9nPSJ0cnVlIj4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgVG8gc2V0IEFwYWNoZSBDWEYgYXMgdGhlIGRlZmF1bHQgV2ViIHNlcnZpY2UgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoIHNlbGVjdCA8Yj5XaW5kb3ctJmd0O1ByZWZlcmVuY2VzPC9iPiBmcm9tIHRoZSBtYWluIG1lbnUsIGV4cGFuZCB0aGUgPGI+V2ViIFNlcnZpY2VzPC9iPiBvdXRsaW5lIHRyZWUgbm9kZSB3aXRoaW4gdGhlIHJlc3VsdGluZyBkaWFsb2csIGFuZCBjaG9vc2UgPGI+U2VydmVyIGFuZCBSdW50aW1lPC9iPi4gU2VsZWN0aW5nIHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiB3aWxsIG9wZW4gdGhpcyBwcmVmZXJlbmNlIHBhZ2UuCi08YnIvPgotPGJyLz4KLUluIHRoZSA8Yj5XZWIgc2VydmljZSBydW50aW1lPC9iPiBkcm9wIGRvd24gbGlzdCBzZWxlY3QgJnF1b3Q7QXBhY2hlIENYRiAyLngmcXVvdDsgYW5kIGNsaWNrIDxiPk9LPC9iPi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UpIi8+DQotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtYm90dG9tVXAtY3hmLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtYm90dG9tVXAtY3hmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOGFhY2E1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWJvdHRvbVVwLWN4Zi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkIHRvIGNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBhbmQgdG8gZGVwbG95IHRoYXQgc2VydmljZSB0byBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciBhbmQgdGVzdCBpdCB1c2luZyB0aGUgV2ViIFNlcnZpY2VzIEV4cGxvcmVyLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaW50cm8+Ci0gICA8aXRlbQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9nZXR0aW5nU3RhcnRlZC9xcy05Lmh0bSIKLSAgICAgICAgIHRpdGxlPSJDcmVhdGUgb3IgSW1wb3J0IGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENyZWF0ZSBvciBpbXBvcnQgYSBKYXZhIGJlYW4gdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIFdlYiBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIGludG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgYSBEeW5hbWljIFdlYiBQcm9qZWN0IHRoYXQgaGFzIGJlZW4gZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSIKLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIgotICAgICAgICAgdGl0bGU9IkNyZWF0ZSBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVG8gY3JlYXRlIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7RmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIuLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1dlYiBTZXJ2aWNlcyZxdW90OyBjYXRlZ29yeSBhbmQgc2VsZWN0ICZxdW90O1dlYiBTZXJ2aWNlJnF1b3Q7LiBDbGljayAmcXVvdDtPSyZxdW90OyB0byBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmQgb3Igc2VsZWN0IHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuIj4KLSAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQpIi8+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtCb3R0b20gdXAgSmF2YSBiZWFuIFdlYiBTZXJ2aWNlJnF1b3Q7IGFzIHRoZSAmcXVvdDtXZWIgc2VydmljZSB0eXBlJnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IkJyb3dzZSB0byBzZWxlY3QgdGhlIFNlcnZpY2UgSW1wbGVtZW50YXRpb24uIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iVmVyaWZ5IHRoYXQgJnF1b3Q7QXBhY2hlIENYRiAyLngmcXVvdDsgaXMgc2VsZWN0ZWQgYXMgdGhlIFdlYiBzZXJ2aWNlIHJ1bnRpbWUuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iTW92ZSB0aGUgc2VydmljZSBzbGlkZXIgdG8gdGhlICZxdW90O1Rlc3Qgc2VydmljZSZxdW90OyBzdGFnZS4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJBY2NlcHQgYWxsIG90aGVyIGRlZmF1bHQgdmFsdWVzIG9uIHRoaXMgcGFnZSBhbmQgY2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9Ik9uIHRoZSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBjb25maWd1cmF0aW9uIHBhZ2Ugc2VsZWN0IHRoZSAmcXVvdDtVc2UgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSZxdW90OyBjaGVjayBib3ggZm9sbG93ZWQgYnkgdGhlICZxdW90O0NyZWF0ZSBhbiBTRUkmcXVvdDsgYnV0dG9uLiBFbnRlciBhIG5hbWUgZm9yIHRoZSBTRUksICZxdW90O1NlbGVjdCBBbGwmcXVvdDsgdGhlIG1ldGhvZHMgYW5kIGNsaWNrICZxdW90O0ZpbmlzaCZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHRlc3R3c2RsLmh0bWwiCi0gICAgICAgICBza2lwPSJ0cnVlIgotICAgICAgICAgdGl0bGU9IlRlc3QgdGhlIFdlYiBzZXJ2aWNlIHdpdGggdGhlIFdlYiBTZXJ2aWNlcyBFeHBsb3JlciI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGUgV2ViIFNlcnZpY2VzIFdpemFyZCB3aWxsIGxhdW5jaCB0aGUgPGI+V2ViIFNlcnZpY2VzIEV4cGxvcmVyPC9iPiBhZnRlciBzdWNjZXNzZnVsbHkgY3JlYXRpbmcgYW5kIGRlcGxveWluZyB5b3VyIFdlYiBzZXJ2aWNlIHRvIEFwYWNoZSBUb21jYXQuCi08YnIvPgotPGJyLz4KLVRvIHRlc3QgdGhlIFdlYiBzZXJ2aWNlIHNlbGVjdCBhbiBvcGVydGFpb24gaW4gdGhlIDxiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYj4sIGZpbGwgaW4gdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGFuZCBjbGljayA8Yj5HbzwvYj4uCi08YnIvPgotPGJyLz4KLVRoZSByZXN1bHQgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIDxiPlN0YXR1czwvYj4gcGFuZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gIDxvbkNvbXBsZXRpb24+Ci0gICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGNyZWF0ZWQgYSBKQVgtV1MgV2ViIHNlcnZpY2UhCi0gIDwvb25Db21wbGV0aW9uPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jbGllbnQtY3hmLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGUtY2xpZW50LWN4Zi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5NjhjMTYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jbGllbnQtY3hmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldAotICAgICAgdGl0bGU9IkdlbmVyYXRlIGEgSkFYLVdTIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIj4KLSAgIDxpbnRybwotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBnZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSIKLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCIKLSAgICAgICAgIHRpdGxlPSJHZW5lcmF0ZSBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVG8gZ2VuZXJhdGUgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwcy4KLSAgICAgICAgIAotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxzdWJpdGVtIGxhYmVsPSJTZWxlY3QgJnF1b3Q7RmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIuLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1dlYiBTZXJ2aWNlcyZxdW90OyBjYXRlZ29yeSBhbmQgY2hvb3NlICZxdW90O1dlYiBTZXJ2aWNlIENsaWVudCZxdW90Oy4gQ2xpY2sgJnF1b3Q7T0smcXVvdDsuIFNlbGVjdCB0aGUgJnF1b3Q7Q2xpY2sgdG8gcGVyZm9ybSZxdW90OyBidXR0b24gYmVsb3cgdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LiI+Ci0gICAgICAgICA8Y29tbWFuZAotICAgICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCkiLz4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iRW50ZXIgdGhlIFVSSSB0byB0aGUgcmVtb3RlIFdTREwgZmlsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2xpZW50LiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtKYXZhIFByb3h5JnF1b3Q7IGFzIHRoZSAmcXVvdDtDbGllbnQgdHlwZSZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJWZXJpZnkgdGhhdCAmcXVvdDtBcGFjaGUgQ1hGIDIueCZxdW90OyBpcyBzZWxlY3RlZCBhcyB0aGUgJnF1b3Q7V2ViIHNlcnZpY2UgcnVudGltZSZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgdGhlICZxdW90O0NsaWVudCBwcm9qZWN0JnF1b3Q7IGxpbmsgdG8gY2hvb3NlIHRoZSBwcm9qZWN0IGluIHRvIHdoaWNoIHRoZSBKQVgtV1MgY2xpZW50IHdpbGwgYmUgZ2VuZXJhdGVkLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9Ik1vdmUgdGhlIGNsaWVudCBzbGlkZXIgcG9zaXRpb24gdG8gJnF1b3Q7RGV2ZWxvcCBDbGllbnQmcXVvdDsgYW5kIGNsaWNrICZxdW90O0ZpbmlzaCZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIvZ2V0dGluZ1N0YXJ0ZWQvcXMtMTIuaHRtIgotICAgICAgICAgdGl0bGU9IlJ1biB0aGUgSkFYLVdTIGNsaWVudCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBCZWZvcmUgcnVubmluZyB0aGUgY2xpZW50IGNoZWNrIHRoZSBvcGVyYXRpb24gcGFyYW1ldGVycyB0aGF0IENYRiBnZW5lcmF0ZWQgZm9yIHlvdSBhbmQgZWRpdCBpZiBuZWNlc3NhcnkuCi08YnIvPgotPGJyLz4KLVRvIDxiPnJ1bjwvYj4geW91ciBjbGllbnQsIHJpZ2h0LWNsaWNrIG9uIHRoZSBjbGllbnQgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8Yj5SdW4gQXMgJmd0OyBKYXZhIEFwcGxpY2F0aW9uPC9iPi4gQSBuZXcgY29uc29sZSB2aWV3IHdpbGwgb3BlbiBhbmQgZGlzcGxheSB0aGUgcmVzcG9uc2VzIG9mIHRoZSBvcGVyYXRpb24gaW52b2NhdGlvbnMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS1jeGYtcHJvamVjdC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWN4Zi1wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjIzMDVmOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLWN4Zi1wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiPg0KLSAgIDxpbnRybw0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gY3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBDWEYgSkFYLVdTIFdlYiBzZXJ2aWNlIGRldmVsb3BtZW50LgotICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9pbnRybz4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvY2pwZXJzLmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIFdoZW4gd29ya2luZyB3aXRoIEpBWC1XUyBXZWIgc2VydmljZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLiBJZiB5b3UgYWxyZWFkeSBoYXZlIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgPGI+Q2xpY2sgdG8gU2tpcDwvYj4gYnV0dG9uLiBJZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3cgLSZndDsgT3BlbiBQZXJzcGVjdGl2ZSAtJmd0OyBPdGhlci4uLjwvYj4gZnJvbSB0aGUgbWFpbiBtZW51IGFuZCAgY2hvb3NlIDxiPkphdmEgRUU8L2I+IGluIHRoZSByZXN1bHRpbmcgPGI+T3BlbiBQZXJzcGVjdGl2ZTwvYj4gZGlhbG9nIGJveC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxjb21tYW5kDQotICAgICAgICAgICAgcmVxdWlyZWQ9ImZhbHNlIg0KLSAgICAgICAgICAgIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBkaWFsb2c9InRydWUiDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCI+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgIEJlZm9yZSBjcmVhdGluZyBhIEpBWC1XUyBXZWIgU2VydmljZSwgd2UgbmVlZCBhIHByb2plY3QgdG8gcHV0IGl0IGluLiBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gY3JlYXRlIGFuIER5bmFtaWMgV2ViIFByb2plY3QuCi08YnIvPgotPGJyLz4KLVNlbGVjdCA8Yj5GaWxlIC0mZ3Q7IE5ldyAtJmd0OyBQcm9qZWN0Li4uPC9iPiBmcm9tIHRoZSBtYWluIG1lbnUsIGV4cGFuZCB0aGUgPGI+V2ViPC9iPiBjYXRlZ29yeSB3aXRoaW4gdGhlIHJlc3VsdGluZyA8Yj5OZXcgUHJvamVjdDwvYj4gZGlhbG9nIGJveCBhbmQgY2hvb3NlIDxiPkR5bmFtaWMgV2ViIFByb2plY3Q8L2I+LgotPGJyLz4KLTxici8+Ci1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkIGVudGVyIGEgPGI+UHJvamVjdCBuYW1lOjwvYj4sIHNlbGVjdCBBcGFjaGUgVG9tY2F0IGFzIHRoZSA8Yj5UYXJnZXQgcnVudGltZTwvYj4gYW5kIGNsaWNrIDxiPkZpbmlzaDwvYj4uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkKSIvPg0KLSAgIDwvaXRlbT4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2luc3RhbGxfY3hmX2ZhY2V0Lmh0bWwiDQotICAgICAgICAgc2tpcD0idHJ1ZSINCi0gICAgICAgICB0aXRsZT0iRW5hYmxlIEpBWC1XUyBXZWIgc2VydmljZSBkZXZlbG9wZW1lbnQiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBFbmFibGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCBieSByaWdodC1jbGlja2luZyBvbiB0aGUgcHJvamVjdCBhbmQgc2VsZWN0aW5nIDxiPlByb3BlcnRpZXM8L2I+LgotPGJyLz4KLTxici8+Ci1JbiB0aGUgPGI+UHJvamVjdCBGYWNldHM8L2I+IHBhZ2UgZW5hYmxlIHRoZSA8Yj5DWEYgMi54IFdlYiBTZXJ2aWNlczwvYj4gZmFjZXQgYnkgc2VsZWN0aW5nIHRoZSBjaGVjayBib3ggYW5kIGNsaWNrIDxiPk9LPC9iPi4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLXRvbWNhdC1zZXJ2ZXIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b21jYXQtc2VydmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDNmMmRkMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLXRvbWNhdC1zZXJ2ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIj4NCi0gICA8aW50cm8NCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGluc3RhbGwgYW5kIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgQXBhY2hlIFRvbWNhdCBzZXJ2ZXIgaW4gb3JkZXIgdG8gZGVwbG95IGFuZCB0ZXN0IHlvdXIgSkFYLVdTIFdlYiBzZXJ2aWNlLgotICAgICAgICAgICAgPGJyLz4KLSAgICAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9pbnRybz4NCi0gICA8aXRlbQ0KLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Quc2VydmVyLnVpLmRvYy51c2VyL3RvcGljcy90b21jYXQuaHRtbCINCi0gICAgICAgICBza2lwPSJ0cnVlIg0KLSAgICAgICAgIHRpdGxlPSJEb3dubG9hZCBhbmQgaW5zdGFsbCBBcGFjaGUgVG9tY2F0Ij4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgRG93bmxvYWQgYW5kIGluc3RhbGwgQXBhY2hlIFRvbWNhdCB2ZXJzaW9uIDUuNS54IG9yIDYuMC54IGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOiBodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvLiBTZWxlY3RpbmcgIHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiBiZWxvdyB3aWxsIG9wZW4gYSB3ZWIgYnJvd3NlciBhdCB0aGF0IGxvY2F0aW9uLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPGNvbW1hbmQNCi0gICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiDQotICAgICAgICAgICAgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5vcGVuQnJvd3Nlcih1cmw9aHR0cDovL3RvbWNhdC5hcGFjaGUub3JnLykiLz4NCi0gICA8L2l0ZW0+DQotICAgPGl0ZW0NCi0gICAgICAgICBkaWFsb2c9InRydWUiDQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudWkuZG9jLnVzZXIvdG9waWNzL3RvbWNhdC5odG1sIg0KLSAgICAgICAgIHNraXA9ImZhbHNlIg0KLSAgICAgICAgIHRpdGxlPSJDcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIiPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGhlIHN0ZXBzIHRvIGNyZWF0ZSBhIFRvbWNhdCBzZXJ2ZXIgaW4gdGhlIHdvcmtiZW5jaC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxzdWJpdGVtDQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtGaWxlIC0mZ3Q7IE5ldyAtJmd0OyBPdGhlci4uLiZxdW90OyBmcm9tIHRoZSBtYWluIG1lbnUsIGV4cGFuZCB0aGUgJnF1b3Q7U2VydmVyJnF1b3Q7IGNhdGVnb3J5IHdpdGhpbiB0aGUgcmVzdWx0aW5nICZxdW90O05ldyBXaXphcmQmcXVvdDsgZGlhbG9nIGJveCBhbmQgY2hvb3NlICZxdW90O1NlcnZlciZxdW90Oy4gQ2xpY2sgJnF1b3Q7TmV4dCAmZ3Q7JnF1b3Q7LiINCi0gICAgICAgICAgICBza2lwPSJ0cnVlIj4NCi0gICAgICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5uZXcuc2VydmVyKSIvPg0KLSAgICAgIDwvc3ViaXRlbT4NCi0gICAgICA8c3ViaXRlbQ0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgdGhlIHZlcnNpb24gb2YgVG9tY2F0IHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIG9uIHRoZSBmaXJzdCBwYWdlLiBDbGljayAmcXVvdDtOZXh0ICZndDsmcXVvdDsuIg0KLSAgICAgICAgICAgIHNraXA9InRydWUiPg0KLSAgICAgIDwvc3ViaXRlbT4NCi0gICAgICA8c3ViaXRlbQ0KLSAgICAgICAgICAgIGxhYmVsPSJTcGVjaWZ5IHRoZSBUb21jYXQgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBhbmQgY2xpY2sgJnF1b3Q7RmluaXNoJnF1b3Q7LiINCi0gICAgICAgICAgICBza2lwPSJ0cnVlIj4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iT3BlbiB0aGUgU2VydmVycyB2aWV3IGJ5IHNlbGVjdGluZyAmcXVvdDtXaW5kb3cgLSZndDsgU2hvdyBWaWV3IC0mZ3Q7IE90aGVyLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1NlcnZlciZxdW90OyBjYXRlZ29yeSB3aXRoaW4gdGhlIHJlc3VsdGluZyAmcXVvdDtTaG93IFZpZXcmcXVvdDsgZGlhbG9nIGJveCBhbmQgY2hvb3NlICZxdW90O1NlcnZlcnMmcXVvdDsuIENsaWNrICZxdW90O09LJnF1b3Q7LiINCi0gICAgICAgICAgICBza2lwPSJ0cnVlIj4NCi0gICAgICAgICA8Y29tbWFuZA0KLSAgICAgICAgICAgICAgIHJlcXVpcmVkPSJmYWxzZSINCi0gICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyhvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQ9b3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldykiLz4NCi0gICAgICA8L3N1Yml0ZW0+DQotICAgICAgPHN1Yml0ZW0NCi0gICAgICAgICAgICBsYWJlbD0iU3RhcnQgdGhlIFRvbWNhdCBzZXJ2ZXIgYnkgc2VsZWN0aW5nIHRoZSBzZXJ2ZXIgaW4gdGhlIFNlcnZlcnMgdmlldyBhbmQgY2xpY2tpbmcgdGhlICZxdW90O1N0YXJ0IHRoZSBzZXJ2ZXImcXVvdDsgYnV0dG9uIGluIHRoZSBTZXJ2ZXJzIHZpZXcgdG9vbGJhci4iPg0KLSAgICAgIDwvc3ViaXRlbT4NCi0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZS10b3BEb3duLWN4Zi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLXRvcERvd24tY3hmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk1ZjgyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlLXRvcERvd24tY3hmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldAotICAgICAgdGl0bGU9IkdlbmVyYXRlIGEgSkFYLVdTIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiPgotICAgPGludHJvCi0gICAgICAgICBocmVmPSIvb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvcmVmZXJlbmNlL3JlZi1jaGVhdHNoZWV0cy5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byB1c2UgdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmQgdG8gZ2VuZXJhdGUgYSBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyB0aGUgQXBhY2hlIENYRiBydW50aW1lLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1JZiB5b3UgbmVlZCBoZWxwIGF0IGFueSBzdGVwLCBjbGljayB0aGUgaGVscCBidXR0b24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgKD8pLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaW50cm8+Ci0gICA8aXRlbQotICAgICAgICAgaHJlZj0iL29yZy5lY2xpcHNlLndzdC53c2RsLnVpLmRvYy51c2VyL3Rhc2tzL3RjcnR3c2RsLmh0bWwiCi0gICAgICAgICB0aXRsZT0iQ3JlYXRlIG9yIGltcG9ydCBhIFdTREwgZG9jdW1lbnQiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ3JlYXRlIG9yIGltcG9ydCBhIFdTREwgZmlsZSBpbnRvIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgb2YgdGhlIFdlYiBwcm9qZWN0LiBUaGUgV1NETCBkb2N1bWVudCBtdXN0IGhhdmUgYSB2YWxpZCBzZXJ2aWNlIGVsZW1lbnQuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0KLSAgICAgICAgIGRpYWxvZz0idHJ1ZSIKLSAgICAgICAgIGhyZWY9Ii9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiCi0gICAgICAgICB0aXRsZT0iR2VuZXJhdGUgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSB0aGUgV1NETCBkb2N1bWVudCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUbyBnZW5lcmF0ZSBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJTZWxlY3QgJnF1b3Q7RmlsZSAtJmd0OyBOZXcgLSZndDsgT3RoZXIuLi4mcXVvdDsgZnJvbSB0aGUgbWFpbiBtZW51LCBleHBhbmQgdGhlICZxdW90O1dlYiBTZXJ2aWNlcyZxdW90OyBjYXRlZ29yeSBhbmQgc2VsZWN0ICZxdW90O1dlYiBTZXJ2aWNlJnF1b3Q7LiBDbGljayAmcXVvdDtPSyZxdW90OyB0byBsYXVuY2ggdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmQgb3Igc2VsZWN0IHRoZSAmcXVvdDtDbGljayB0byBwZXJmb3JtJnF1b3Q7IGJ1dHRvbiB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuIj4KLSAgICAgICAgIDxjb21tYW5kCi0gICAgICAgICAgICAgICByZXF1aXJlZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpLndpemFyZC5zZXJ2ZXJ3aXphcmQpIi8+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlNlbGVjdCAmcXVvdDtUb3AgZG93biBKYXZhIGJlYW4gV2ViIFNlcnZpY2UmcXVvdDsgYXMgdGhlICZxdW90O1dlYiBzZXJ2aWNlIHR5cGUmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iQnJvd3NlIHRvIHNlbGVjdCB0aGUgU2VydmljZSBkZWZpbml0aW9uLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9IlZlcmlmeSB0aGF0ICZxdW90O0FwYWNoZSBDWEYgMi54JnF1b3Q7IGlzIHNlbGVjdGVkIGFzIHRoZSBXZWIgc2VydmljZSBydW50aW1lLiI+Ci0gICAgICA8L3N1Yml0ZW0+Ci0gICAgICA8c3ViaXRlbQotICAgICAgICAgICAgbGFiZWw9Ik1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSAmcXVvdDtEZXZlbG9wIHNlcnZpY2UmcXVvdDsgc3RhZ2UuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iQWNjZXB0IGFsbCBvdGhlciBkZWZhdWx0IHZhbHVlcyBvbiB0aGlzIHBhZ2UgYW5kIGNsaWNrICZxdW90O05leHQgJmd0OyZxdW90Oy4iPgotICAgICAgPC9zdWJpdGVtPgotICAgICAgPHN1Yml0ZW0KLSAgICAgICAgICAgIGxhYmVsPSJPbiB0aGUgQXBhY2hlIENYRiBXU0RMIHRvIEphdmEgcGFnZSBhY2NlcHQgdGhlIGRlZmF1bHRzIGFuZCBjbGljayAmcXVvdDtOZXh0ICZndDsmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgICAgIDxzdWJpdGVtCi0gICAgICAgICAgICBsYWJlbD0iU2VsZWN0ICZxdW90O0dlbmVyYXRlIEltcGxlbWVudGF0aW9uJnF1b3Q7IG9uIHRoZSBXU0RMIHRvIEphdmEgcHJlZmVyZW5jZSBvdmVycmlkZSBwYWdlIGFuZCBjbGljayAmcXVvdDtGaW5pc2gmcXVvdDsuIj4KLSAgICAgIDwvc3ViaXRlbT4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9nZW5lcmF0ZS1jeGYtd3NkbC1jbGllbnQtY29tcG9zaXRlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy9nZW5lcmF0ZS1jeGYtd3NkbC1jbGllbnQtY29tcG9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTZhYmViNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvc2l0ZUNoZWF0c2hlZXQgbmFtZT0iR2VuZXJhdGluZyBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiI+Ci0gICA8dGFza0dyb3VwIGtpbmQ9InNldCIgbmFtZT0iR2VuZXJhdGluZyBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgPGludHJvPgotICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBpbmRpdmlkdWFsIHN0ZXBzIHRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGLgotICAgICAgICAgPGJyLz4KLSAgICAgICAgIDxici8+Ci1UaGUgZ2VuZXJhdGVkIGNsaWVudCB3aWxsIGluY2x1ZGUgYSBtYWluKCkgdGhhdCB3aGVuIHJ1biB3aWxsIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBpbnZva2UgZXZlcnkgb3BlcmF0aW9uIG9uIHRoYXQgcmVtb3RlIHNlcnZpY2UuCi0gICAgICAgICA8YnIvPgotICAgICAgICAgPGJyLz4KLVRvIGFzc2lzdCB5b3UgYWxvbmcgdGhlIHdheSwgd2l6YXJkcyBhbmQgY29tbWFuZHMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdSB0byBsYXVuY2ggYXV0b21hdGljYWxseS4KLSAgICAgIDwvaW50cm8+Ci0gICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UganVzdCBqdXN0IGdlbmVyYXRlZCBhIEpBWC1XUyBjbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQhCi0gICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9Ikluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBSdW50aW1lIiBza2lwPSJ0cnVlIj4KLSAgICAgICAgIDxpbnRybz4KLSAgICAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBkZW1vbnN0cmF0ZSBob3cgdG8gaW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgaW4gdGhlIHdvcmtiZW5jaC4KLTxici8+Ci08YnIvPgotSWYgeW91IGhhdmUgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoIHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUhCi0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY29uZmlndXJlLWN4Zi1ydW50aW1lLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iQ3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlcyIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcGVtbnQuCi08YnIvPgotPGJyLz4KLUlmIHlvdSBhbHJlYWR5IGhhdmUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgY3JlYXRlZCBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZWQgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS1jeGYtcHJvamVjdC54bWwiPgotICAgICAgICAgPC9wYXJhbT4KLSAgICAgIDwvdGFzaz4KLSAgICAgIDx0YXNrIGtpbmQ9ImNoZWF0c2hlZXQiIG5hbWU9IkdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIiBza2lwPSJmYWxzZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICA8Yj5JbnRyb2R1Y3Rpb248L2I+Ci0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIDxiPkNvbmNsdXNpb248L2I+Ci0gICAgICAgICA8L29uQ29tcGxldGlvbj4KLSAgICAgICAgIDxwYXJhbSBuYW1lPSJwYXRoIiB2YWx1ZT0iY3JlYXRlLWNsaWVudC1jeGYueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICA8L3Rhc2tHcm91cD4KLTwvY29tcG9zaXRlQ2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9jaGVhdHNoZWV0cy90b3Bkb3duLWN4Zi1jb21wb3NpdGUueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL3RvcGRvd24tY3hmLWNvbXBvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDNmNDk4OGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2NoZWF0c2hlZXRzL3RvcGRvd24tY3hmLWNvbXBvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvc2l0ZUNoZWF0c2hlZXQgbmFtZT0iR2VuZXJhdGluZyBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGIj4KLSAgIDx0YXNrR3JvdXAga2luZD0ic2V0IiBuYW1lPSJHZW5lcmF0aW5nIGEgSkFYLVdTIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxpbnRybz4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5kaXZpZHVhbCBzdGVwcyB0byBzZXR1cCB0aGUgQXBhY2hlIENYRiBydW50aW1lLCBjcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIsICBhIER5bmFtaWMgV2ViIFByb2plY3QgZW5hYmxlZCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgIGFuZCBnZW5lcmF0ZSBhIGEgZnVsbHkgYW5ub3RhdGVkIEpBWC1XUyBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50LiAKLSAgICAgICAgIDxici8+Ci0gICAgICAgICA8YnIvPgotVG8gYXNzaXN0IHlvdSBhbG9uZyB0aGUgd2F5LCB3aXphcmRzIGFuZCBjb21tYW5kcyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91IHRvIGxhdW5jaCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9pbnRybz4KLSAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBqdXN0IGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSwgY3JlYXRlZCBhbiBBcGFjaGUgVG9tY2F0IHNlcnZlciwgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BlbW50IGFuZCBnZW5lcmF0ZWQgYSBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudC4KLSAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iSW5zdGFsbCBhbmQgY29uZmlndXJlIHRoZSBBcGFjaGUgQ1hGIFJ1bnRpbWUiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBpbiB0aGUgd29ya2JlbmNoLgotPGJyLz4KLTxici8+Ci1JZiB5b3UgaGF2ZSBhbHJlYWR5IGluc3RhbGxlZCBhbmQgY29uZmlndXJlZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIGluIHRoZSB3b3JrYmVuY2ggeW91IG1heSBza2lwIHRoaXMgdGFzayBieSBjbGlja2luZyB0aGUgJnF1b3Q7U2tpcCB0aGlzIHRhc2smcXVvdDsgYnV0dG9uLgotICAgICAgICAgPC9pbnRybz4KLSAgICAgICAgIDxvbkNvbXBsZXRpb24+Ci0gICAgICAgICAgICBDb25ncmF0dWxhdGlvbnMhICBZb3UganVzdCBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgdGhlIEFwYWNoZSBDWEYgcnVudGltZSEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjb25maWd1cmUtY3hmLXJ1bnRpbWUueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJJbnN0YWxsIGFuZCBjcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIiIHNraXA9InRydWUiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBpbnN0YWxsIGFuZCBjcmVhdGUgYW4gQXBhY2hlIFRvbWNhdCBzZXJ2ZXIuCi08YnIvPgotPGJyLz4KLUlmIHlvdSBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBjcmVhdGVkIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIHlvdSBtYXkgc2tpcCB0aGlzIHRhc2sgYnkgY2xpY2tpbmcgdGhlICZxdW90O1NraXAgdGhpcyB0YXNrJnF1b3Q7IGJ1dHRvbi4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISAgWW91IGp1c3QgaW5zdGFsbGVkIGFuZCBjcmVhdGVkIGFuIEFwYWNoZSBUb21jYXQgc2VydmVyIQotICAgICAgICAgPC9vbkNvbXBsZXRpb24+Ci0gICAgICAgICA8cGFyYW0gbmFtZT0icGF0aCIgdmFsdWU9ImNyZWF0ZS10b21jYXQtc2VydmVyLnhtbCI+Ci0gICAgICAgICA8L3BhcmFtPgotICAgICAgPC90YXNrPgotICAgICAgPHRhc2sga2luZD0iY2hlYXRzaGVldCIgbmFtZT0iQ3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlcyIgc2tpcD0idHJ1ZSI+Ci0gICAgICAgICA8aW50cm8+Ci0gICAgICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgZGVtb25zdHJhdGUgaG93IHRvIGNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcGVtbnQuCi08YnIvPgotPGJyLz4KLUlmIHlvdSBhbHJlYWR5IGhhdmUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGVuYWJsZWQgIGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCB5b3UgbWF5IHNraXAgdGhpcyB0YXNrIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtTa2lwIHRoaXMgdGFzayZxdW90OyBidXR0b24uCi0gICAgICAgICA8L2ludHJvPgotICAgICAgICAgPG9uQ29tcGxldGlvbj4KLSAgICAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgIFlvdSBqdXN0IGNyZWF0ZWQgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGVkIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCEKLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtY3hmLXByb2plY3QueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICAgICA8dGFzayBraW5kPSJjaGVhdHNoZWV0IiBuYW1lPSJHZW5lcmF0ZSBhIEpBWC1XUyBTRUkgYW5kIGEgc2tlbGV0b24gIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiIgc2tpcD0iZmFsc2UiPgotICAgICAgICAgPGludHJvPgotICAgICAgICAgICAgVGhpcyBjaGVhdCBzaGVldCB3aWxsIGRlbW9uc3RyYXRlIGhvdyB0byBnZW5lcmF0ZSAgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBhbmQgYSBza2VsZXRvbiAgaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudC4KLSAgICAgICAgIDwvaW50cm8+Ci0gICAgICAgICA8b25Db21wbGV0aW9uPgotICAgICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UganVzdCBnZW5lcmF0ZWQgYSBKQVgtV1MgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudC4KLSAgICAgICAgIDwvb25Db21wbGV0aW9uPgotICAgICAgICAgPHBhcmFtIG5hbWU9InBhdGgiIHZhbHVlPSJjcmVhdGUtdG9wRG93bi1jeGYueG1sIj4KLSAgICAgICAgIDwvcGFyYW0+Ci0gICAgICA8L3Rhc2s+Ci0gICA8L3Rhc2tHcm91cD4KLTwvY29tcG9zaXRlQ2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9xdWlja3N0YXJ0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2MzYzNTRlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9xdWlja3N0YXJ0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+UXVpY2sgU3RhcnQ8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+QXBhY2hlIENYRiBRdWljayBTdGFydDwvaDI+Ci08cD5Ucnkgb3V0IHRoZSBmb2xsb3dpbmcgY2hlYXQgc2hlZXRzIHRvIGhlbHAgeW91IHF1aWNrbHkgc3RhcnQgdXNpbmcgSkFYLVdTIFRvb2xzIGFuZCB0aGUgQXBhY2hlIENYRiBydW50aW1lIHRvIGNyZWF0ZSBXZWIgc2VydmljZSBhcHBsaWNhdGlvbnMuPC9wPgotPGJyPgotPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMub3BlbkNoZWF0U2hlZXQoY2hlYXRTaGVldElkPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jeGYuYm90dG9tdXApIiknPgotICAgIAkJPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiBib3R0b211cCBjaGVhdCBzaGVldCI+PHN0cm9uZz5DcmVhdGluZyBhIFdlYiBzZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvc3Ryb25nPjwvYT4KLTxicj4KLTxicj4KLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLm9wZW5DaGVhdFNoZWV0KGNoZWF0U2hlZXRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLnRvcGRvd24pIiknPgotICAgIAkJPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0b3Bkb3duIGNoZWF0IHNoZWV0Ij48c3Ryb25nPkdlbmVyYXRpbmcgYSBKQVgtV1MgU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvc3Ryb25nPjwvYT4KLTxicj4KLTxicj4KLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLm9wZW5DaGVhdFNoZWV0KGNoZWF0U2hlZXRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLnRvcGRvd24uY2xpZW50KSIpJz4KLSAgICAJCTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gY2xpZW50IGNoZWF0IHNoZWV0Ij48c3Ryb25nPkdlbmVyYXRpbmcgYSBKQVgtV1MgY2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3N0cm9uZz48L2E+Ci08YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjFlM2FhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDcyNmY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YmVlMmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL2xlZ2FsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvbGVnYWwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjEyZmNmYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvbGVnYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkxlZ2FsPC90aXRsZT4KLQk8bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+TGVnYWw8L2gyPgotPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA5LCBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgotPHA+VGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NTA1ODEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9Q1hGIFdlYiBzZXJ2aWNlcyBVc2VyIEd1aWRlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotY2hlYXRzaGVldC5jeGYuYm90dG9tdXAuY29tcG9zaXRlPUNyZWF0aW5nIGEgV2ViIHNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyBBcGFjaGUgQ1hGCi1jaGVhdHNoZWV0LmN4Zi50b3Bkb3duLmNvbXBvc2l0ZT1HZW5lcmF0aW5nIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYKLWNoZWF0c2hlZXQuY3hmLnRvcGRvd24uY2xpZW50LmNvbXBvc2l0ZT1HZW5lcmF0aW5nIGEgSkFYLVdTIFdlYiBTZXJ2aWNlIENsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjQ5NWYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0idG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIi8+Ci0gICAgICA8dG9jIGZpbGU9InRvY3Rhc2tzLnhtbCIvPgotICAgICAgPHRvYyBmaWxlPSJ0b2NyZWZlcmVuY2UueG1sIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MiCi0gICAgICAgICAgICBjb21wb3NpdGU9InRydWUiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9ib3R0b21VcC1jeGYtY29tcG9zaXRlLnhtbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY3hmLmJvdHRvbXVwIgotICAgICAgICAgICAgbmFtZT0iJWNoZWF0c2hlZXQuY3hmLmJvdHRvbXVwLmNvbXBvc2l0ZSI+Ci0gICAgICA8L2NoZWF0c2hlZXQ+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cyIKLSAgICAgICAgICAgIGNvbXBvc2l0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL3RvcGRvd24tY3hmLWNvbXBvc2l0ZS54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi50b3Bkb3duIgotICAgICAgICAgICAgbmFtZT0iJWNoZWF0c2hlZXQuY3hmLnRvcGRvd24uY29tcG9zaXRlIj4KLSAgICAgIDwvY2hlYXRzaGVldD4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzIgotICAgICAgICAgICAgY29tcG9zaXRlPSJ0cnVlIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvZ2VuZXJhdGUtY3hmLXdzZGwtY2xpZW50LWNvbXBvc2l0ZS54bWwiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmN4Zi50b3Bkb3duLmNsaWVudCIKLSAgICAgICAgICAgIG5hbWU9IiVjaGVhdHNoZWV0LmN4Zi50b3Bkb3duLmNsaWVudC5jb21wb3NpdGUiPgotICAgICAgPC9jaGVhdHNoZWV0PgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMwOWFlYTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5DWEYgUHJvamVjdCBGYWNldDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5DWEYgUHJvamVjdCBGYWNldDwvaDI+Ci08cD5GYWNldHMgY2FuIGJlIHRob3VnaHQgb2YgYXMgdW5pdHMgb2YgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIGZhY2V0IGJhc2VkIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmFjZXRzIHNlZSB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9jZmFjZXRzLmh0bWwiPldUUCBQcm9qZWN0IEZhY2V0cyBkb2N1bWVudGF0aW9uPC9hPi48L3A+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgdGhlIENYRiBGYWNldCB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgd2hlbiBpbnN0YWxsZWQgb24gYSBEeW5hbWljIFdlYiBQcm9qZWN0OjwvcD4KLTx1bD4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIENsYXNzcGF0aCBDb250YWluZXIuPC9saT4KLSAgPGxpPkNvbmZpZ3VyZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgQ1hGIEpBWC1XUyBlbmRwb2ludCBjb25maWd1cmF0aW9uIG9wdGlvbiB0aGF0IGlzIHNlbGVjdGVkIGluIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIj5FbmRwb2ludCBDb25maWc8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci0gIDxsaT5FbmFibGVzIEpBWC1XUyBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgaWYgdGhlIG9wdGlvbiBpcyBzZWxlY3RlZCBpbiB0aGUgPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIj5KQVgtV1M8L2E+IHByZWZlcmVuY2VzLjwvbGk+Ci08L3VsPgotPHA+VGhlIENYRiBGYWNldCBoYXMgdGhlIGZvbGxvd2luZyBmYWNldCBwcmVyZXF1aXNpdGVzOjwvcD4KLTx1bD4KLSAgPGxpPkR5bmFtaWMgV2ViIE1vZHVsZSB2ZXJzaW9uIDIuNTwvbGk+Ci0gIDxsaT5KYXZhIHZlcnNpb24gNS4wIG9yIGdyZWF0ZXI8L2xpPgotPC91bD4KLTxwPlRoZSBDWEYgRmFjZXQgYW5kIGl0J3MgcHJlcmVxdWlzaXRlcyBhcmUgZ3JvdXBlZCBpbnRvIGEgcHJvamVjdCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHNlbGVjdGVkIHdoZW4gY3JlYXRpbmcgYSBEeW5hbWljIFdlYiBQcm9qZWN0LjwvcD4KLQotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGluZyBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvaW5zdGFsbF9jeGZfZmFjZXQuaHRtbCI+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvZW5kcG9pbnRfY29uZmlnX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM0YjkzYWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SkFYLVdTIEVuZHBvaW50IENvbmZpZ3VyYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+RW5kcG9pbnQgQ29uZmlnIFByZWZlcmVuY2VzPC9oMj4KLTxwPlRoZSA8c3Ryb25nPkVuZHBvaW50IENvbmZpZzwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgc2V0dGluZyB0aGF0IGNvbnRyb2wgdGhlIHR5cGUgb2YgZW5kcG9pbnQgY29uZmlndXJhdGlvbiB0aGF0IHdlYiBwcm9qZWN0cyBhcmUgY29uZmlndXJlZCB3aXRoIHdoZW4gdGhlIENYRiBGYWNldCBpcyBpbnN0YWxsZWQuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3NwcmluZ19jb25maWcucG5nIiBhbHQ9IlNwcmluZyBDb25maWcgdGFiIiA+IDwvcD4KLTxwPjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPk9wdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+RGVmYXVsdDwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGhlYWQ+Ci0KLSAgICAgIDx0Ym9keT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgQ1hGIFNlcnZsZXQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5DcmVhdGVzIGEgY3hmLXNlcnZsZXQueG1sIGZpbGUgaW4gdGhlIFdlYiBQcm9qZWN0cyBXRUItSU5GIGRpcmVjdG9yeS4gVGhpcyBpcyB0aGUgc2xvd2VyIG9wdGlvbiBvZiB0aGUgdHdvIGFzIGl0IGxvYWRzIGFsbCBwb3NzaWJsZSBDWEYgbW9kdWxlcyBmb3IgYW4gZW5kcG9pbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlVzZSBTcHJpbmcgQXBwbGljYXRpb24gQ29udGV4dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkNyZWF0ZXMgYSBiZWFucy54bWwgZmlsZSBpbiB0aGUgV2ViIFByb2plY3RzIFdFQi1JTkYgZGlyZWN0b3J5LiBUaGlzIGlzIHRoZSBmYXN0ZXN0IG9wdGlvbiBhcyBpdCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2Ygd2hpY2ggQ1hGIG1vZHVsZXMgdG8gbG9hZCBmb3IgYW4gZW5kcG9pbnQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0gICAgCi08cD5EdXJpbmcgYm90dG9tLXVwIGFuZCB0b3AtZG93biB3ZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhlIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgd2ViIHByb2plY3QgaXMgdXBkYXRlZCB3aXRoIGEgamF4d3M6ZW5kcG9pbnQgZWxlbWVudCBmb3IgdGhlIGdlbmVyYXRlZCB3ZWIgc2VydmljZS48L3A+Ci0KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vcmVmZXJlbmNlL2N4Zl9mYWNldC5odG1sIj5DWEYgUHJvamVjdCBGYWNldDwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwiPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfdG9wZG93bi5odG1sIj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYxMmJlYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYXB0X3Byb2Nlc3NpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvY3hmMnhfcHJlZmVyZW5jZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZmYzN2I4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4ZjJ4X3ByZWZlcmVuY2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9jeGZfcnVudGltZV90YWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNGI2ZTcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXZhMndzX3RhYi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9qYXZhMndzX3RhYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI4OTA2OGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF2YTJ3c190YWIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF4d3NfYW5ub3RhdGlvbnMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvamF4d3NfYW5ub3RhdGlvbnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MjE2OTBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2pheHdzX2Fubm90YXRpb25zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NlcnZlcl9ydW50aW1lLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGYwMzBmMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9zcHJpbmdfY29uZmlnLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NwcmluZ19jb25maWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNTY2NDE3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3NwcmluZ19jb25maWcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvd3NkbDJqYXZhLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3dzZGwyamF2YS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcwMmQ2NGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvd3NkbDJqYXZhLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3hqYy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy94amMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmYTc3MDIxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL3hqYy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5ZjMyZmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXZhMndzX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5KYXZhMldTIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkphdmEyV1MgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+SmF2YTJXUzwvc3Ryb25nPiB0YWIgcHJvdmlkZXMgc2V0dGluZ3MgdGhhdCBjb250cm9sIHRoZSBDWEYgamF2YTJ3cyB0b29sIChmb3IgQ1hGIDIuMS54IHJ1bnRpbWVzIGFuZCBhYm92ZSkuIFdoZW4gYSBDWEYgMi4wLnggcnVudGltZSBpcyBzZWxlY3RlZCB0aGlzIHBhZ2UgZGlzcGxheXMgYSBzdWJzZXQgb2YgdGhlIGF2YWlsYWJsZSBzZXR0aW5nIHRoYXQgcHJvdmlkZXMgY29udHJvbCBvZiB0aGUgQ1hGIGphdmEyd3NkbCB0b29sLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9qYXZhMndzX3RhYi5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkRlZmF1bHQgRnJvbnRlbmQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TcGVjaWZpZXMgdGhlIGZyb250IGVuZCB0byB1c2UuIEN1cnJlbnRseSBvbmx5IHRoZSBqYXh3cyBmcm9udCBlbmQgaXMgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmpheHdzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5EZWZhdWx0IERhdGFiaW5kaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U3BlY2lmaWVzIHRoZSBkYXRhIGJpbmRpbmcgdG8gdXNlLiBDdXJyZW50bHkgb25seSB0aGUgamF4YiBkYXRhIGJpbmRpbmcgaXMgc3VwcG9ydGVkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+amF4YjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgQ2xpZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIGEgY2xpZW50IG1haW5saW5lIHVzaW5nIEpBWC1XUyBBUElzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBTZXJ2ZXI8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgbWFpbmxpbmUgdXNpbmcgSkFYLVdTIEFQSXM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgV3JhcHBlciBhbmQgRmF1bHQgQmVhbnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgd3JhcHBlciBhbmQgZmF1bHQgYmVhbnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICAKLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPiAgICAgICAgCi0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBXU0RMPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIGEgV1NETCBkb2N1bWVudDwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIAotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5EZWZhdWx0IFNPQVAgQmluZGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNwZWNpZnkgdGhlIFNPQVAgYmluZGluZyB0byBpbmNsdWRlIGluIHRoZSBnZW5lcmF0ZWQgV1NETCBkb2N1bWVudC4gU09BUCAxLjEgYW5kIFNPQVAgMS4yIHN1cHBvcnRlZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNPQVAgMS4xPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBzZXBhcmF0ZSBYU0QgZm9yIHRoZSB0eXBlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBvdXRwdXQgc2NoZW1hcyB0byBzZXBhcmF0ZSBmaWxlcyB3aGVuIGdlbmVyYXRpbmcgYSBXU0RMIGRvY3VtZW50PC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci08cD5UaGUgb3B0aW9ucyBvbiB0aGlzIHRhYiBhcmUgcHJlc2VudGVkIGluIHRoZSB3ZWIgc2VydmljZXMgd2l6YXJkIHdoZW4gY3JlYXRpbmcgYSBib3R0b20tdXAgd2ViIHNlcnZpY2Ugd2l0aCB0aGUgQXBhY2hlIENYRiBydW50aW1lLjwvcD4KLTxwPlRoZSBvcHRpb25zIHRoZXJlIGNhbiBiZSBjaGFuZ2VkIGZyb20gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB3ZWIgc2VydmljZSBiZWluZyBjcmVhdGVkLjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXh3c190YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDNmNzQ3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL2pheHdzX3RhYi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkpBWC1XUyBQcmVmZXJlbmNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5KQVgtV1MgUHJlZmVyZW5jZXM8L2gyPgotPHA+VGhlIDxzdHJvbmc+SkFYLVdTPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBzZXR0aW5ncyB0aGF0IGNvbnRyb2wgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIEpBWC1XUyBhbm5vdGF0aW9ucyBhbmQgdGhlIGVuYWJsZW1lbnQgb2YgSkFYLVdTIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9qYXh3c19hbm5vdGF0aW9ucy5wbmciIGFsdD0iSkFYV1MgQW5ub3RhdGlvbnMiID4gPC9wPgotPHA+U2VsZWN0IHRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgdGhhdCBhcmUgYWRkZWQgYnkgZGVmYXVsdCB0byB0aGUgaW1wbGVtZW50YXRpb24gYmVhbiBvciBTRUkgYmVmb3JlIGlucHV0IHRvIHRoZSBDWEYgamF2YTJ3cyB0b29sLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hcHRfcHJvY2Vzc2luZy5wbmciIGFsdD0iQVBUIFByb2Nlc3NpbmciPiA8L3A+Ci08cD5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nIGluIHdlYiBwcm9qZWN0cyB3aGVuIGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0LjwvcD4KLTxwPlRoZSBKRFQgQVBUIHByb2Nlc3NvcnMgcmVwb3J0IGVycm9ycywgd2FybmluZ3MgYW5kIGluZm9ybWF0aW9uIG1lc3NhZ2VzIGluIHRoZSBKYXZhIEVkaXRvciBhbmQgUHJvYmxlbXMgVmlldyB3aGVuIEpBWC1XUyBydWxlcyBhcmUgYnJva2VuLjwvcD4KLTxwPkFubm90YXRpb24gcHJvY2Vzc2luZyBjYW4gYmUgZW5hYmxlZCBhbmQgZGlzYWJsZWQgb24gYW55IEphdmEgYmFzZWQgcHJvamVjdCB1c2luZyB0aGUgQW5ub3RhdGlvbiBQcm9jZXNzaW5nIHByb3BlcnRpZXMgcGFnZSBvbiB0aGUgcHJvamVjdHMgY29udGV4dCBtZW51LjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbCI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvcHJlZmVyZW5jZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NlZDI4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+QXBhY2hlIENYRiAyLnggUHJlZmVyZW5jZXM8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5BcGFjaGUgQ1hGIDIueCBQcmVmZXJlbmNlczwvaDI+Ci08cD5KQVgtV1MgVG9vbHMgcHJvdmlkZXMgYSBwcmVmZXJlbmNlIHBhZ2UgZm9yIHNldHRpbmcgdXAgYW5kIGNvbmZpZ3VyaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUuPC9wPgotPHA+VGhlIENYRiAyLnggcHJlZmVyZW5jZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSAKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5jeGYudWkuQ1hGUnVudGltZVByZWZlcmVuY2VzUGFnZSkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBDWEYgMi54IHByZWZlcmVuY2UgcGFnZSI+Ci08c3Ryb25nPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzLi4uICZndDsgV2ViIFNlcnZpY2VzICZndDsgQ1hGIDIueCBQcmVmZXJlbmNlczwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuIDwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9jeGYyeF9wcmVmZXJlbmNlcy5wbmciIGFsdD0iQ1hGIDIueCBQcmVmZXJlbmNlcyIgPiA8L3A+Ci08cD5UaGUgQ1hGIFJ1bnRpbWUgdGFiIGlzIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgYSBDWEYgMi54IHJ1bnRpbWUuPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2N4Zl9ydW50aW1lX3RhYi5wbmciIGFsdD0iQ1hGIDIueCBQcmVmZXJlbmNlcyIgPiA8L3A+Ci08cD5UaGUgPHN0cm9uZz5FeHBvcnQgcnVudGltZSBsaWJyYXJpZXMuLi48L3N0cm9uZz4gb3B0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgY29udHJvbHMgd2hldGhlciB0aGUgQ1hGIGxpYnJhcnkgamFyIGZpbGVzIGFyZSByZXNvbHZlZCBpbnRvIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIgb2YgdGhlIHdlYiBtb2R1bGUgYXQgZGVwbG95bWVudCB0aW1lLjwvcD4KLTxwPlRoaXMgb3B0aW9uIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIG9uIGV4aXN0aW5nIHByb2plY3RzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgd2l0aCB0aGUgQ1hGIEZhY2V0IHVzaW5nIHRoZSBKYXZhIEVFIE1vZHVsZSBEZXBlbmRlbmNpZXMgcHJvcGVydGllcyBwYWdlLjwvcD4KLTxwPkZvciBkZXRhaWxzIG9uIHRoZSBvdGhlciBDWEYgMi54IHByZWZlcmVuY2VzIHRhYnMsIHJlZmVyIHRvIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzOjwvcD4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9ImphdmEyd3NfdGFiLmh0bWwiPkphdmEyV1M8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IndzZGwyamF2YV90YWIuaHRtbCI+V1NETDJKYXZhPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJqYXh3c190YWIuaHRtbCI+SkFYLVdTPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJlbmRwb2ludF9jb25maWdfdGFiLmh0bWwiPkVuZHBvaW50IENvbmZpZzwvYT48L2xpPgotPC91bD4KLUZvciBpbmZvcm1hdGlvbiBvbiBzZXR0aW5nIEFwYWNoZSBDWEYgYXMgdGhlIGRlZmF1bHQgV2ViIHNlcnZpY2VzIHJ1bnRpbWUsIHJlZmVyIHRvIHRoaXMgZG9jdW1lbnQuCi08dWw+Ci0gIDxsaT48YSBocmVmPSJzZXJ2ZXJfcnVudGltZS5odG1sIj5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L2E+PC9saT4KLTwvdWw+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sIj5NYW5hZ2UgdGhlIGV4cG9ydGluZyBvZiBDWEYgbGlicmFyaWVzIGF0IGRlcGxveW1lbnQgdGltZTwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjJjNzAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2Uvc2VydmVyX3J1bnRpbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5TZXJ2ZXIgYW5kIFJ1bnRpbWU8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+U2VydmVyIGFuZCBSdW50aW1lPC9oMj4KLUFwYWNoZSBDWEYgY2FuIGJlIHNldCBhcyB0aGUgZGVmYXVsdCBXZWIgc2VydmljZXMgcnVudGltZSBzZWxlY3Rpb24gaW4gdGhlIFdlYiBzZXJ2aWNlcyB3aXphcmRzIHVzaW5nIHRoZSBTZXJ2ZXIgYW5kIFJ1bnRpbWUgcHJlZmVyZW5jZSBwYWdlLgotPHA+VGhlIFNlcnZlciBhbmQgUnVudGltZSBwcmVmZXJlbmNlIHBhZ2UgY2FuIGJlIGFjY2Vzc2VkIHZpYSAKLTxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLndpbmRvdy5wcmVmZXJlbmNlcyhwcmVmZXJlbmNlUGFnZUlkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wcmVmZXJlbmNlcy5TZXJ2ZXJSdW50aW1lUHJlZmVyZW5jZVBhZ2UpIiknPgotPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgQ1hGIDIueCBwcmVmZXJlbmNlIHBhZ2UiPgotPHN0cm9uZz5XaW5kb3cgJmd0OyBQcmVmZXJlbmNlcy4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFNlcnZlciBhbmQgUnVudGltZTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuIDwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9zZXJ2ZXJfcnVudGltZS5wbmciIGFsdD0iU2VydmVyIGFuZCBSdW50aW1lIiA+IDwvcD4KLTxwPlNlbGVjdCA8Yj5BcGFjaGUgQ1hGIDIueDwvYj4gaW4gdGhlIDxiPldlYiBzZXJ2aWNlIHJ1bnRpbWU8L2I+IGRyb3AgZG93biBsaXN0IGFuZCBjbGljayA8Yj5PSzwvYj4uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS93c2RsMmphdmFfdGFiLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2UyYjcwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+V1NETDJKYXZhIFByZWZlcmVuY2VzPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPldTREwySmF2YSBQcmVmZXJlbmNlczwvaDI+Ci08cD5UaGUgPHN0cm9uZz5XU0RMMkphdmE8L3N0cm9uZz4gdGFiIHByb3ZpZGVzIHNldHRpbmdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBjb2RlIGdlbmVyYXRlZCBieSB0aGUgQ1hGIHdzZGwyamF2YSB0b29sLgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3dzZGwyamF2YS5wbmciIGFsdD0iSmF2YTJXUyB0YWIiID4gPC9wPgotPHA+PC9wPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSIgc3VtbWFyeT0iSmF2YSBzZWFyY2ggYWN0aW9ucyI+Ci0gICAgICA8dGhlYWQ+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8cD48c3BhbiBjbGFzcz0iY29udHJvbCI+T3B0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+PC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RoZWFkPgotCi0gICAgICA8dGJvZHk+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+R2VuZXJhdGUgU2VydmVyPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGEgc2VydmVyIG1haW5saW5lPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHN0YXJ0aW5nIHBvaW50IGNvZGUgZm9yIGFuIGltcGxlbWVudGF0aW9uIGJlYW48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5HZW5lcmF0ZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIGdlbmVyYXRlZCBhcnRpZmFjdHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGEgZ2VuZXJhdGVkIGNsaWVudCBhbmQgaW1wbGVtZW50YXRpb248L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD50cnVlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgcHJvY2Vzc2luZyBvZiBpbXBsaWNpdCBTT0FQIGhlYWRlcnM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBwcm9jZXNzaW5nIG9mIG9mIFNPQVAgaGVhZGVycyBkZWZpbmVkIGluIHRoZSB3c2RsOmJpbmRpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5FbmFibGUgbG9hZGluZyBvZiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgcGFja2FnZSBuYW1lIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IG5hbWVwc2FjZSBwYWNrYWdlIG5hbWUgbWFwcGluZzwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPnRydWU8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGRlZmF1bHQgZXhjbHVkZXMgbmFtZXNwYWNlIG1hcHBpbmc8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZW5hYmxlIHRoZSBsb2FkaW5nIG9mIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIG5hbWVzcGFjZSBtYXBwaW5nPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+dHJ1ZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+RW5hYmxlIEF1dG8gTmFtZSBSZXNvbHV0aW9uPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBuYW1pbmcgY29uZmxpY3RzIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgYmluZGluZyBjdXN0b21pemF0aW9uczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Vc2UgdGhlIEFwYWNoZSBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGdlbmVyYXRlIHRoZSBvbGRlciBDWEYgcHJvcHJpZXRhcnkgV1MtQWRkcmVzc2luZyB0eXBlcyBpbnN0ZWFkIG9mIHRoZSBKQVgtV1MgMi4xIGNvbXBsaWFudCBXUy1BZGRyZXNzaW5nIHR5cGVzLiBVc2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggQ1hGIDIuMDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBYSkMgcHJvY2Vzc29yLjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy94amMucG5nIiBhbHQ9IkphdmEyV1MgdGFiIiA+IDwvcD4KLTxwPjwvcD4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIHN1bW1hcnk9IkphdmEgc2VhcmNoIGFjdGlvbnMiPgotICAgICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9ImNvbnRyb2wiPk9wdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZD4KLSAgICAgICAgICAgIDxwPjxzcGFuIGNsYXNzPSJjb250cm9sIj5EZWZhdWx0PC9zcGFuPjwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90aGVhZD4KLQotICAgICAgPHRib2R5PgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YZHY8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaW5pdGlhbGl6ZSBmaWVsZHMgbWFwcGVkIGZyb20gZWxlbWVudHMgd2l0aCB0aGVpciBkZWZhdWx0IHZhbHVlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+U2VsZWN0IHRvIGFjdGl2YXRlIHBsdWdpbiB0byBhZGQgYSB0b1N0cmluZygpIG1ldGhvZCB0byBnZW5lcmF0ZWQgY2xhc3NlczwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+ICAgICAgICAgCi0gICAgICAgIDwvdHI+Ci0KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD4tWHRzOnN0eWxlOm11bHRpbGluZTwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBoYXZlIHRvU3RyaW5nIHByb2R1Y2UgbXVsdGkgbGluZSBvdXRwdXQ8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVh0czpzdHlsZTpzaW1wbGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gaGF2ZSB0b1N0cmluZyBwcm9kdWNlIHNpbmdsZSBsaW5lIHRlcnNlIG91dHB1dDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPmZhbHNlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIAotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1YbG9jYXRvcjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBlbmFibGUgc291cmNlIGxvY2F0aW9uIHN1cHBvcnQgZm9yIGdlbmVyYXRlZCBjb2RlPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4gICAgICAgIAotCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+LVhzeW5jLW1ldGhvZHM8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5TZWxlY3QgdG8gZ2VuZXJhdGUgYWNjZXNzb3IgbWV0aG9kcyB3aXRoIHRoZSAnc3luY2hyb25pemVkJyBrZXl3b3JkPC9wPgotICAgICAgICAgIDwvdGQ+Ci0KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+ZmFsc2U8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLQotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPi1tYXJrLWdlbmVyYXRlZDwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPlNlbGVjdCB0byBhZGQgQEdlbmVyYXRlZCBhbm5vdGF0aW9ucyB0byB0aGUgZ2VuZXJhdGVkIGNvZGU8L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5mYWxzZTwvcD4KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgotCi0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLTxwPlRoZSBvcHRpb25zIG9uIHRoaXMgdGFiIGFyZSBwcmVzZW50ZWQgaW4gdGhlIHdlYiBzZXJ2aWNlcyB3aXphcmQgd2hlbiBjcmVhdGluZyBhIHRvcC1kb3duIHdlYiBzZXJ2aWNlIHdpdGggdGhlIEFwYWNoZSBDWEYgcnVudGltZS48L3A+Ci08cD5UaGUgb3B0aW9ucyB0aGVyZSBjYW4gYmUgY2hhbmdlZCBmcm9tIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgd2ViIHNlcnZpY2UgYmVpbmcgY3JlYXRlZC48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCI+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NvbmZpZ3VyaW5nX2pheHdzX2Fubm90YXRpb25fcHJvY2Vzc2luZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZGU4OWYyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNvbmZpZ3VyaW5nIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2gyPgotPHA+SWYgdGhlIDxzdHJvbmc+RW5hYmxlIGFubm90YXRpb24gdmFsaWRhdGlvbiBwcm9jZXNzaW5nPC9zdHJvbmc+IHNldHRpbmcgb24gdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9qYXh3c190YWIuaHRtbCI+SkFYLVdTPC9hPiB0YWIgaW4KLXRoZSBBcGFjaGUgQ1hGIDIueCBwcmVmZXJlbmNlcyBpcyBzZWxlY3RlZCwgYW5ub3RhdGlvbiBwcm9jZXNzaW5nIHdpbGwgYmUgZW5hYmxlZCBvbiBwcm9qZWN0cyBvbiBhcyBwYXJ0IG9mIHRoZSBDWEYgRmFjZXQgaW5zdGFsbC48L3A+Ci0KLTxoMz5FbmFibGluZyBFeGlzdGluZyBQcm9qZWN0czwvaDM+Ci1UbyB0dXJuIGFubm90YXRpb24gcHJvY2Vzc2luZyBvbiBvciBvZmYgb24gYW4gZXhpc3RpbmcgcHJvamVjdCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdCBhbmQgY2hvb3NlIDxiPlByb3BlcnRpZXM8L2I+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gCi0gT24gdGhlIDxzdHJvbmc+SmF2YSBDb21waWxlciA+IEFubm90YXRpb24gUHJvY2Vzc2luZzwvc3Ryb25nPiBwcm9wZXJ0aWVzIHBhZ2Ugc2VsZWN0IG9yIGRlc2VsZWN0IHRoZSA8c3Ryb25nPkVuYWJsZSBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L3N0cm9uZz4gY2hlY2sgYm94IGFuZCB0aGVuIGNsaWNrIDxiPk9LPC9iPi4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9hbm5vdGF0aW9uX3Byb2Nlc3NpbmcucG5nIiBhbHQ9IkFubm90YXRpb24gUHJvY2Vzc2luZyIgPiA8L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWZiM2UxNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2JvdHRvbXVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkNyZWF0ZSBhIFdlYiBTZXJ2aWNlIGZyb20gYSBKYXZhIGltcGxlbWVudGF0aW9uIGJlYW4gdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotPGxpPkluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGVudmlyb25tZW50LiBTZWUgdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiPlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uPC9hPiBwYWdlIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLTxsaT5DcmVhdGUgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBlbmFibGUgaXQgZm9yIEFwYWNoZSBDWEYgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IGFzIGRlc2NyaWJlZCBoZXJlOiA8YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCI+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvYT4uPC9saT4KLTxsaT5DcmVhdGUgb3IgaW1wb3J0IGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIGludG8gdGhlIHNvdXJjZSBmb2xkZXIgb2YgdGhlIER5bmFtaWMgV2ViIFByb2plY3QuPC9saT4KLTwvb2w+Ci1UbyBjcmVhdGUgYSBXZWIgc2VydmljZSBmcm9tIGEgSmF2YSBiZWFuIHVzaW5nIHRoZSBBcGFjaGUgQ1hGIHJ1bnRpbWUgZW52aXJvbm1lbnQ6Ci08b2w+Ci08bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci08bGk+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldyBzZWxlY3QgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB0aGF0IHlvdSBjcmVhdGVkIG9yIGltcG9ydGVkIGludG8gdGhlIER5bmFtaWMgV2ViIFByb2plY3RzIHNvdXJjZSBmb2xkZXIuPC9saT4KLTxsaT5PcGVuIHRoZSBXZWIgU2VydmljZSB3aXphcmQgYnkgc2VsZWN0aW5nIDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiIGhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZChuZXdXaXphcmRJZD1vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkud2l6YXJkLnNlcnZlcndpemFyZCkiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBuZXcgd2ViIHNlcnZpY2Ugd2l6YXJkIj48c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlci4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFdlYiBTZXJ2aWNlPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS48L2xpPgotPGxpPldlYiBTZXJ2aWNlcyBwYWdlOiBzZWxlY3QgPGI+Qm90dG9tIHVwIEphdmEgYmVhbiBXZWIgU2VydmljZTwvYj4gYXMgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIGJyb3dzZSB0byBzZWxlY3QgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIHdoaWNoIHRvIGNyZWF0ZSB0aGUgV2ViIHNlcnZpY2U6PHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2JvdHRvbV91cF93aXphcmQucG5nIiBhbHQ9IkJvdHRvbSBVcCBXZWIgU2VydmljZXMgV2l6YXJkIiA+PC9wPgotPG9sIHR5cGU9ImEiPgotPGxpPk1vdmUgdGhlIHNlcnZpY2Ugc2xpZGVyIHRvIHRoZSBzdGFnZSBvZiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgdGhhdCB5b3Ugd2lzaCB0byBjb21wbGV0ZS48L2xpPgotPHVsPgotPGxpPkRldmVsb3A6IEludm9rZXMgdGhlIEFwYWNoZSBDWEYgamF2YTJ3cyB0b29sIHVzaW5nIHRoZSBwcmVmZXJlbmNlIGRlZmF1bHRzIGFuZCB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgaW4gdGhlIHdpemFyZCB0byBjcmVhdGUgYSBzZXJ2aWNlLiBUaGUgd2l6YXJkIGFsc28gZ2VuZXJhdGVzIGEgSkFYLVdTIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZS48L2xpPgotPGxpPkFzc2VtYmxlOiBJZiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IHNlcnZlciB0aGlzIHBoYXNlIGFzc2VtYmxlcyBhbmQgY29uZmlndXJlcyB0aGUgcHJvamVjdCB0aGF0IGhvc3RzIHRoZSBXZWIgc2VydmljZSBpbnRvIGFuIEVBUi48L2xpPgotPGxpPkRlcGxveTogR2VuZXJhdGVzIHRoZSBkZXBsb3ltZW50IGFydGlmYWN0cyBmb3IgdGhlIFdlYiBzZXJ2aWNlLjwvbGk+Ci08bGk+SW5zdGFsbDogSW5zdGFsbHMgYW5kIGNvbmZpZ3VyZXMgdGhlIFdlYiBNb2R1bGUgYW5kIEVBUnMgb24gdGhlIHRhcmdldCBzZXJ2ZXIuPC9saT4KLTxsaT5TdGFydDogU3RhcnRzIHRoZSB0YXJnZXQgc2VydmVyIG9uY2UgdGhlIFdlYiBzZXJ2aWNlIGhhcyBiZWVuIGluc3RhbGxlZCBvbiBpdC48L2xpPgotPGxpPlRlc3Q6IFVzZSB0aGUgV2ViIFNlcnZpY2UgRXhwbG9yZXIgdG8gdGVzdCB0aGUgZ2VuZXJhdGVkIFdlYiBzZXJ2aWNlLjwvbGk+Ci08L3VsPgotPGxpPlNlcnZlcjogU2VsZWN0IGEgc2VydmVyIHRvIGRlcGxveSB5b3VyIFdlYiBzZXJ2aWNlIHRvLjwvbGk+Ci08bGk+V2ViIHNlcnZpY2UgcnVudGltZTogU2VsZWN0IEFwYWNoZSBDWEYgMi54PC9saT4KLTxsaT5TZXJ2aWNlIHByb2plY3Q6IFNlbGVjdCB0aGUgcHJvamVjdCBpbiB5b3VyIHdvcmtzcGFjZSBpbnRvIHdoaWNoIEFwYWNoZSBDWEYgd2lsbCBnZW5lcmF0ZSB0aGUgY29kZS48L2xpPgotPGxpPklmIHlvdSB3aXNoIHRvIGdlbmVyYXRlIGEgY2xpZW50IGZvciB5b3VyIFdlYiBzZXJ2aWNlLCBzZWxlY3QgPGI+SmF2YSBQcm94eTwvYj4gYXMgdGhlIENsaWVudCB0eXBlOgotPHVsPgotPGxpPk1vdmUgdGhlIGNsaWVudCBzbGlkZXIgdG8gdGhlIDxiPkRldmVsb3AgY2xpZW50PC9iPiBzdGFnZS48L2xpPgotPGxpPkNsaWVudCBwcm9qZWN0OiBTZWxlY3QgYSBkaWZmZXJlbnQgcHJvamVjdCBpbnRvIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBjbGllbnQgY29kZS4gVGhlIHdpemFyZCB3aWxsIGNyZWF0ZSB0aGUgcHJvamVjdCBmb3IgeW91IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNvbmZpZ3VyZSBpdCB3aXRoIHRoZSBDWEYgRmFjZXQuPC9saT4KLTwvdWw+PC9saT4KLTxsaT5QdWJsaXNoIHRoZSBXZWIgc2VydmljZTogTGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L2xpPgotPGxpPk1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlOiBNb25pdG9yIHRoZSBXZWIgc2VydmljZSdzIFNPQVAgdHJhZmZpYyB1c2luZyB0aGUgVENQL0lQIE1vbml0b3IuPC9saT4KLTwvb2w+PC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gcGFnZToKLTxvbD4KLTxsaT5Vc2UgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZTogU2VsZWN0IG9yIGNyZWF0ZSBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIChTRUkpIHRoYXQgZGVmaW5lcyB0aGUgbWV0aG9kcyB5b3Ugd2lzaCB0byBleHBvc2UgaW4gdGhlIHNlcnZpY2UuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoLiAKLTx1bD4KLTxsaT5TZWxlY3QgYW4gU0VJOiBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIFNFSS48L2xpPgotPGxpPkNyZWF0ZSBhbiBTRUk6IENyZWF0ZSBhbiBJbnRlcmZhY2UgZnJvbSB0aGUgSW1wbGVtZW50YXRpb24gYnkgcHJvdmlkaW5nIGEgbmFtZSBhbmQgdGhlIG1ldGhvZHMgdG8gZGVjbGFyZSBpbiB0aGUgZXh0cmFjdGVkIGludGVyZmFjZS48L2xpPgotPC91bD4KLUJvdGggb3B0aW9ucyBjcmVhdGUgb3IgdXBkYXRlIHRoZSA8aT5AV2ViU2VydmljZS5lbmRwb2ludEludGVyZmFjZTwvaT4gZWxlbWVudCBvbiB0aGUgaW1wbGVtZW50YXRpb24gYmVhbi4gCi08L29sPgotPC9saT4KLTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIEpBWC1XUyBhbm5vdGF0aW9ucyBjb25maWd1cmF0aW9uIHBhZ2U6Ci08cD5UaGlzIHBhZ2UgYWxsb3dzIHlvdSBhZGQgdG8gSkFYLVdTIGFubm90YXRpb25zIHRvIHRoZSBTRUkgb3IgSW1wbGVtZW50YXRpb24gKGlmIG5vdCB1c2luZyBhbiBleHBsaWNpdCBTRUkpLjwvcD4KLTxwPlRoZSBKQVgtV1MgYW5ub3RhdGlvbnMgZWxlbWVudCB2YWx1ZXMgZGVmYXVsdCB0byB0aG9zZSBvdXRsaW5lZCBpbiB0aGUgSkFYLVdTIHNwZWNpZmljYXRpb25zLjwvcD4KLTxwPklmIHRoZSBJbXBsZW1lbnRhdGlvbiBiZWFuIC8gU0VJIGNvbnRhaW5zIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGUgSkFYLVdTIGFubm90YXRpb25zIGFkZGVkIG9uIHRoaXMgcGFnZSBhZGp1c3QgdG8gcmVzb2x2ZSB0aG9zZSBjb25mbGljdHMuPC9wPjwvbGk+Ci08bGk+Q2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPiB0byBtb3ZlIHRvIHRoZSBBcGFjaGUgQ1hGIGphdmEyd3MgY29uZmlndXJhdGlvbiBwYWdlIHdoaWNoIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL2phdmEyd3NfdGFiLmh0bWwiPmphdmEyd3M8L2E+IHByZWZlcmVuY2VzOgotPC9saT4KLQk8bGk+VGVzdCBXZWIgU2VydmljZSBwYWdlLiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIHNlcnZpY2Ugc2xpZGVyIG9uIHRoZSBmaXJzdCBwYWdlIHdhcyBzZXQgdG8gVGVzdCBzZXJ2aWNlLgotCTxwPlNlbGVjdCB0aGUgbGF1bmNoIGJ1dHRvbiB0byB0ZXN0IHRoZSBXZWIgU2VydmljZSB3aXRoIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpLmRvYy51c2VyL3Rhc2tzL3R0ZXN0d3NkbC5odG1sIj5XZWIgU2VydmljZXMgRXhwbG9yZXI8L2E+LjwvcD4KLQk8L2xpPgotCTxsaT5BcGFjaGUgQ1hGIEpBWC1XUyBjbGllbnQgY29uZmlndXJhdGlvbiBwYWdlOiBUaGlzIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIGNsaWVudCBzbGlkZXIgb24gdGhlIFdlYiBzZXJ2aWNlcyBwYWdlIHdhcyBzZXQgdG8gPGI+RGV2ZWxvcCBjbGllbnQ8L2I+LgotCTxwPlJlZmVyIHRvIHRoZSA8YSBocmVmPSIuL2NyZWF0ZV9jbGllbnQuaHRtbCI+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50PC9hPiBwYWdlIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBkaXNwbGF5ZWQgb24gdGhpcyBwYWdlLjwvcD4KLQk8L2xpPgotCTxsaT5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBQYWdlOiBTZWxlY3Qgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS4gQ2xpY2sgPGI+RmluaXNoPC9iPjwvbGk+Ci08L29sPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY2xpZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGUxZjU2MDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+R2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvbGl2ZWhlbHAuanMiPjwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvaDI+Ci08aDM+UHJlcmVxdWlzaXRlczo8L2gzPgotPG9sPgotICAgIDxsaT5JbnN0YWxsIGFuZCBjb25maWd1cmUgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudC4gU2VlIHRoZSA8YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIEluc3RhbGxhdGlvbjwvYT4gcGFnZSBmb3IgbW9yZSBkZXRhaWxzLjwvbGk+Ci0gICAgPGxpPkNyZWF0ZSBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGVuYWJsZSBpdCBmb3IgQXBhY2hlIENYRiBXZWIgc2VydmljZXMgZGV2ZWxvcG1lbnQgYXMgZGVzY3JpYmVkIGhlcmU6IDxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9jeGZfcHJvamVjdC5odG1sIj5DcmVhdGUgYSBwcm9qZWN0IGZvciBDWEYgV2ViIHNlcnZpY2VzPC9hPi48L2xpPgotPC9vbD4KLVRvIGdlbmVyYXRlIGEgSkFYLVdTIGNsaWVudCBmcm9tIGEgV1NETCBkb2N1bWVudDoKLTxvbD4KLQk8bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiCi0JCWhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci0JPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIENsaWVudCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aXphcmQuY2xpZW50LmNsaWVudHdpemFyZCkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgbmV3IHdlYiBzZXJ2aWNlIGNsaWVudCB3aXphcmQiPjxzdHJvbmc+RmlsZQotCSZndDsgTmV3ICZndDsgT3RoZXIuLi4gJmd0OyBXZWIgU2VydmljZXMgJmd0OyBXZWIgU2VydmljZSBDbGllbnQ8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51LjwvbGk+Ci0JPGxpPldlYiBTZXJ2aWNlcyBwYWdlOgotCTxwPjxpbWcgc3JjPSIuL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZyIgYWx0PSJXZWIgU2VydmljZXMgQ2xpZW50IFdpemFyZCI+PC9wPgotCTxvbCB0eXBlPSJhIj4KLQkgICAgPExpPkVudGVyIHRoZSBVUkkgdG8gdGhlIHJlbW90ZSBXU0RMIGZpbGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L0xpPgotCQk8bGk+U2VsZWN0IDxiPkphdmEgUHJveHk8L2I+IGFzIHRoZSBDbGllbnQgdHlwZS48L2xpPgotCQk8bGk+TW92ZSB0aGUgY2xpZW50IHNsaWRlciB0byB0aGUgPGI+RGV2ZWxvcCBjbGllbnQ8L2I+IHN0YWdlLjwvbGk+Ci0JCTxsaT5XZWIgc2VydmljZSBydW50aW1lOiBTZWxlY3QgQXBhY2hlIENYRiAyLng8L2xpPgotCQk8bGk+U2VydmljZSBwcm9qZWN0OiBTZWxlY3QgdGhlIHByb2plY3QgaW4geW91ciB3b3Jrc3BhY2UgaW50byB3aGljaCBBcGFjaGUgQ1hGIHdpbGwgZ2VuZXJhdGUgdGhlIGNvZGUuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgZmlyc3QgQXBhY2hlIENYRiB3c2RsMmphdmEgQ29uZmlndXJhdGlvbiBwYWdlOgotCTxvbD4KLQkJPGxpPk91dHB1dCBEaXJlY3Rvcnk6IFNwZWNpZnkgdGhlIHNvdXJjZSBmb2xkZXIgaW4gdGhlIHNlcnZpY2UgcHJvamVjdCBpbnRvIHdoaWNoIHRoZSBjb2RlIGlzIGdlbmVyYXRlZC48L2xpPgotCQk8bGk+UGFja2FnZSBOYW1lOiBUeXBlIHRoZSBKYXZhIHBhY2thZ2UgbmFtZSB0byB1c2UgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZS48L2xpPgotCQk8bGk+U3BlY2lmeSBXU0RMIE5hbWVzcGFjZSB0byBQYWNrYWdlIE5hbWUgTWFwcGluZ3M6IE9wdGlvbmFsbHkgc3BlY2lmeSBXU0RMIG5hbWVzcGFjZSBtYXBwaW5ncyB0byBKYXZhIHBhY2thZ2UgbmFtZXMuPC9saT4KLQkJPGxpPlNlcnZpY2UgTmFtZTogU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgV1NETCBzZXJ2aWNlIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgY29kZS4gVGhlIGRlZmF1bHQgaXMgdG8gZ2VuZXJhdGUgY29kZSBmb3IgZXZlcnkgc2VydmljZSBpbiB0aGUgV1NETCBkb2N1bWVudC48L2xpPgotCQk8bGk+QmluZGluZyBGaWxlczogU3BlY2lmeSBvbmUgb3IgbW9yZSBKQVgtV1Mgb3IgSkFYQiBiaW5kaW5nIGZpbGVzLjwvbGk+Ci0JPC9vbD4KLQk8L2xpPgotCTxsaT5DbGljayA8Yj5OZXh0ICZndDs8L2I+IHRvIG1vdmUgdG8gdGhlIHNlY29uZCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBjb25maWd1cmF0aW9uIHBhZ2Ugd2hpY2ggYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0aGUgPGEgaHJlZj0iLi4vcmVmZXJlbmNlL3dzZGwyamF2YV90YWIuaHRtbCI+d3NkbDJqYXZhPC9hPiBkZWZhdWx0IHByZWZlcmVuY2VzOgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPkZpbmlzaDwvYj4gdG8gZ2VuZXJhdGUgdGhlIGNsaWVudC48L2xpPgotPC9vbD4KLTxwPlRoZSBnZW5lcmF0ZWQgY2xpZW50IHdpbGwgaW5jbHVkZSBhIG1haW4oKSB0aGF0IHdoZW4gcnVuIHdpbGwgY29ubmVjdCB0byB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIGludm9rZSBldmVyeSBvcGVyYXRpb24gb24gdGhhdCByZW1vdGUgc2VydmljZS48L3A+Ci08cD5CZWZvcmUgcnVubmluZyB0aGUgY2xpZW50IG9wZW4gdGhlIGNsaWVudCBpbiB0aGUgSmF2YSBFZGl0b3IgYW5kIGVkaXQgdGhlIGdlbmVyYXRlZCBhcmd1bWVudHMgdXNlZCB0byBpbnZva2UgdGhlIG9wZXJhdGlvbnMgb24gdGhlIHNlcnZpY2UuPC9wPgotPHA+VG8gPGI+cnVuPC9iPiB0aGUgY2xpZW50IHJpZ2h0LWNsaWNrIG9uIHRoZSBjbGllbnQgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8Yj5SdW4gQXMgPiBKYXZhIEFwcGxpY2F0aW9uPC9iPi4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTU1MGM2NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+Q3JlYXRlIGEgcHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2gyPgotPHA+VG8gY3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgc3RlcHM6PGJyLz4KLTxvbD4KLTxsaT4KLVNlbGVjdCA8YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmQobmV3V2l6YXJkSWQ9b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldC5XZWJQcm9qZWN0V2l6YXJkKSIpJz4KLTxpbWcgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9jb21tYW5kX2xpbmsucG5nIiBhbHQ9Ik9wZW4gdGhlIG5ldyBkeW5hbWljIHdlYiBwcm9qZWN0IHdpemFyZCI+PHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdC4uLiAmZ3Q7IFdlYiAmZ3Q7IER5bmFtaWMgV2ViIFByb2plY3Q8L3N0cm9uZz48L2E+IGZyb20gdGhlIHRvcCBsZXZlbCBtZW51Ci1lbnRlciB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOgotPG9sIHR5cGU9ImEiPgotPGxpPlByb2plY3QgbmFtZTogRW50ZXIgYSBuYW1lIG9mIHRoZSBwcm9qZWN0LjwvbGk+Ci08bGk+VGFyZ2V0IFJ1bnRpbWU6IFNlbGVjdCB0aGUgc2VydmVyIHlvdSB3aXNoIHRvIGRlcGxveSB5b3VyIFdlYiBzZXJ2aWNlIHRvLiBJZiBpdCdzIG5vdCBsaXN0ZWQKLWNsaWNrIDxiPk5ldzwvYj4gYW5kIGJyb3dzZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMgaW5zdGFsbGVkLjwvbGk+Ci08bGk+RHluYW1pYyBXZWIgTW9kdWxlIHZlcnNpb246IFNlbGVjdCB2ZXJzaW9uIDIuNTwvbGk+Ci08bGk+RGVmYXVsdCBDb25maWd1cmF0aW9uOiBTZWxlY3QgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgeW91ciBzZXJ2ZXIgdHlwZS48L2xpPgotPGxpPkVBUiBNZW1iZXJzaGlwOiBJZiBkZXBsb3lpbmcgdG8gQXBhY2hlIFRvbWNhdCBlbnN1cmUgdGhhdCB0aGUgPGI+QWRkIHByb2plY3QgdG8gYW4gRUFSPC9iPiBjaGVjayBib3ggaXMgbm90IHNlbGVjdGVkLjwvbGk+Ci08bGk+Q2xpY2sgRmluaXNoPC9saT4KLTwvb2w+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rhc2tzL2luc3RhbGxfY3hmX2ZhY2V0Lmh0bWwiPkluc3RhbGwgdGhlIENYRiBQcm9qZWN0IEZhY2V0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwiPk1hbmFnZSB0aGUgZXhwb3J0aW5nIG9mIENYRiBsaWJyYXJpZXMgYXQgZGVwbG95bWVudCB0aW1lPC9hPjwvbGk+Ci08L29sPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci9yZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiPkNYRiBQcm9qZWN0IEZhY2V0PC9hPjxicj4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSIuLi90YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCI+Q3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgYmVhbiB1c2luZyBBcGFjaGUgQ1hGPC9hPjxicj4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwiPkdlbmVyYXRlIGFuIFNFSSBhbmQgYSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBiZWFuIGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2NyZWF0ZV90b3Bkb3duLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWYxMDRlMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgICA8dGl0bGU+R2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvdGl0bGU+Ci0gICAgPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMj5HZW5lcmF0ZSBhbiBTRUkgYW5kIGEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gYmVhbiBmcm9tIGEgV1NETCBkb2N1bWVudCB1c2luZyBBcGFjaGUgQ1hGPC9oMj4KLTxoMz5QcmVyZXF1aXNpdGVzOjwvaDM+Ci08b2w+Ci0gICAgPGxpPkluc3RhbGwgYW5kIGNvbmZpZ3VyZSB0aGUgQXBhY2hlIENYRiBydW50aW1lIGVudmlyb25tZW50LiBTZWUgdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcmVxdWlyZW1lbnRzLmh0bWwiPlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uPC9hPiBwYWdlIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLSAgICA8bGk+Q3JlYXRlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBhbmQgZW5hYmxlIGl0IGZvciBBcGFjaGUgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudCBhcyBkZXNjcmliZWQgaGVyZTogPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+LjwvbGk+Ci0JPGxpPkNyZWF0ZSBvciBpbXBvcnQgYSBXU0RMIGRvY3VtZW50IGludG8gdGhlIFdlYiBDb250ZW50IGZvbGRlciBvZiB0aGUgRHluYW1pYyBXZWIgUHJvamVjdC48L2xpPgotPC9vbD4KLTxici8+Ci1UbyBjcmVhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgdGhlIEFwYWNoZSBDWEYgcnVudGltZSBlbnZpcm9ubWVudDoKLTxvbD4KLQk8bGk+U2VsZWN0IDxhIGNsYXNzPSJjb21tYW5kLWxpbmsiCi0JCWhyZWY9J2phdmFzY3JpcHQ6ZXhlY3V0ZUNvbW1hbmQoIm9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcy5zaG93UGVyc3BlY3RpdmUob3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVzLnNob3dQZXJzcGVjdGl2ZS5wZXJzcGVjdGl2ZUlkPW9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSkiKSc+Ci0JPGltZyBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2NvbW1hbmRfbGluay5wbmciIGFsdD0iT3BlbiB0aGUgSmF2YSBFRSBwZXJzcGVjdGl2ZSI+PHN0cm9uZz5XaW5kb3cgJmd0OyBPcGVuIFBlcnNwZWN0aXZlICZndDsgSmF2YSBFRTwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUgdG8gc3dpdGNoIHRvIHRoZSBKYXZhIEVFIHBlcnNwZWN0aXZlLjwvbGk+Ci0JPGxpPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgc2VsZWN0IHRoZSBXU0RMIGRvY3VtZW50IHRoYXQgeW91IGNyZWF0ZWQgb3IgaW1wb3J0ZWQgaW50byB0aGUgRHluYW1pYyBXZWIgUHJvamVjdHMgV2ViIENvbnRlbnQgZm9sZGVyLjwvbGk+Ci0gICAgPGxpPk9wZW4gdGhlIFdlYiBTZXJ2aWNlIHdpemFyZCBieSBzZWxlY3RpbmcgPGEgY2xhc3M9ImNvbW1hbmQtbGluayIgaHJlZj0namF2YXNjcmlwdDpleGVjdXRlQ29tbWFuZCgib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkKG5ld1dpemFyZElkPW9yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS53aXphcmQuc2VydmVyd2l6YXJkKSIpJz4KLSAgICA8aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBuZXcgd2ViIHNlcnZpY2Ugd2l6YXJkIj48c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBPdGhlci4uLiAmZ3Q7IFdlYiBTZXJ2aWNlcyAmZ3Q7IFdlYiBTZXJ2aWNlPC9zdHJvbmc+PC9hPiBmcm9tIHRoZSB0b3AgbGV2ZWwgbWVudS48L2xpPgotCTxsaT5XZWIgU2VydmljZXMgcGFnZTogc2VsZWN0IDxiPlRvcCBkb3duIEphdmEgYmVhbiBXZWIgU2VydmljZTwvYj4gYXMgdGhlIFdlYiBzZXJ2aWNlIHR5cGUgYW5kIGJyb3dzZSB0byBzZWxlY3QgdGhlIFdTREwgZG9jdW1lbnQgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgU0VJIGFuZCBpbXBsZW1lbnRhdGlvbiBiZWFuOgotCTxwPjxpbWcgc3JjPSIuL2ltYWdlcy90b3BfZG93bl93aXphcmQucG5nIiBhbHQ9IlRvcCBkb3duIFdlYiBTZXJ2aWNlcyBXaXphcmQiPjwvcD4KLQk8b2wgdHlwZT0iYSI+Ci0JCTxsaT5Nb3ZlIHRoZSBzZXJ2aWNlIHNsaWRlciB0byB0aGUgc3RhZ2Ugb2YgV2ViIHNlcnZpY2VzIGRldmVsb3BtZW50IHRoYXQgeW91IHdpc2ggdG8gY29tcGxldGUuPC9saT4KLQkJPHVsPgotCQkJPGxpPkRldmVsb3A6IEludm9rZXMgdGhlIEFwYWNoZSBDWEYgd3NkbDJqYXZhIHRvb2wgdXNpbmcgdGhlIHByZWZlcmVuY2UgZGVmYXVsdHMgYW5kIHRoZSBpbmZvcm1hdGlvbiBnYXRoZXJlZCBpbiB0aGUgd2l6YXJkIHRvIGdlbmVyYXRlIGFuIGFubm90YXRlZCBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZSBhbmQgc3VwcG9ydGluZyBjbGFzc2VzLiBUaGUgd2l6YXJkIGFsc28gZ2VuZXJhdGVzIGEgSkFYLVdTIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24gZmlsZS48L2xpPgotCQkJPGxpPkFzc2VtYmxlOiBJZiByZXF1aXJlZCBieSB0aGUgdGFyZ2V0IHNlcnZlciB0aGlzIHBoYXNlCi0JCQlhc3NlbWJsZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIHByb2plY3QgdGhhdCBob3N0cyB0aGUgV2ViIHNlcnZpY2UgaW50byBhbiBFQVIuPC9saT4KLQkJCTxsaT5EZXBsb3k6IEdlbmVyYXRlcyB0aGUgZGVwbG95bWVudCBhcnRpZmFjdHMgZm9yIHRoZSBXZWIgc2VydmljZS48L2xpPgotCQkJPGxpPkluc3RhbGw6IEluc3RhbGxzIGFuZCBjb25maWd1cmVzIHRoZSBXZWIgTW9kdWxlIGFuZCBFQVJzIG9uIHRoZSB0YXJnZXQgc2VydmVyLjwvbGk+Ci0JCQk8bGk+U3RhcnQ6IFN0YXJ0cyB0aGUgdGFyZ2V0IHNlcnZlciBvbmNlIHRoZSBXZWIgc2VydmljZSBoYXMgYmVlbiBpbnN0YWxsZWQgb24gaXQuPC9saT4KLQkJCTxsaT5UZXN0OiBVc2UgdGhlIFdlYiBTZXJ2aWNlIEV4cGxvcmVyIHRvIHRlc3QgdGhlIGdlbmVyYXRlZCBXZWIgc2VydmljZS48L2xpPgotCQk8L3VsPgotCQk8bGk+U2VydmVyOiBTZWxlY3QgYSBzZXJ2ZXIgdG8gZGVwbG95IHlvdXIgV2ViIHNlcnZpY2UgdG8uPC9saT4KLQkJPGxpPldlYiBzZXJ2aWNlIHJ1bnRpbWU6IFNlbGVjdCBBcGFjaGUgQ1hGIDIueDwvbGk+Ci0JCTxsaT5TZXJ2aWNlIHByb2plY3Q6IFNlbGVjdCB0aGUgcHJvamVjdCBpbiB5b3VyIHdvcmtzcGFjZSBpbnRvIHdoaWNoIEFwYWNoZSBDWEYgd2lsbCBnZW5lcmF0ZSB0aGUgY29kZS48L2xpPgotCQk8bGk+SWYgeW91IHdpc2ggdG8gZ2VuZXJhdGUgYSBjbGllbnQgZm9yIHlvdXIgV2ViIHNlcnZpY2UsIHNlbGVjdCA8Yj5KYXZhIFByb3h5PC9iPiBhcyB0aGUgQ2xpZW50IHR5cGU6Ci0JCTx1bD4KLQkJCTxsaT5Nb3ZlIHRoZSBjbGllbnQgc2xpZGVyIHRvIHRoZSA8Yj5EZXZlbG9wIGNsaWVudDwvYj4gc3RhZ2UuPC9saT4KLQkJCTxsaT5DbGllbnQgcHJvamVjdDogU2VsZWN0IGEgZGlmZmVyZW50IHByb2plY3QgaW50byB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IGNvZGUuIFRoZSB3aXphcmQgd2lsbCBjcmVhdGUgdGhlIHByb2plY3QgZm9yIHlvdSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjb25maWd1cmUgaXQgd2l0aCB0aGUgQ1hGIEZhY2V0LjwvbGk+Ci0JCTwvdWw+Ci0JCTwvbGk+Ci0JCTxsaT5QdWJsaXNoIHRoZSBXZWIgc2VydmljZTogTGF1bmNoIHRoZSBXZWIgU2VydmljZXMgRXhwbG9yZXIgdG8gcHVibGlzaCB5b3VyIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS48L2xpPgotCQk8bGk+TW9uaXRvciB0aGUgV2ViIHNlcnZpY2U6IE1vbml0b3IgdGhlIFdlYiBzZXJ2aWNlJ3MgU09BUCB0cmFmZmljIHVzaW5nIHRoZSBUQ1AvSVAgTW9uaXRvci48L2xpPgotCTwvb2w+Ci0JPC9saT4KLQk8bGk+Q2xpY2sgPGI+TmV4dCAmZ3Q7PC9iPiB0byBtb3ZlIHRvIHRoZSBmaXJzdCBBcGFjaGUgQ1hGIHdzZGwyamF2YSBDb25maWd1cmF0aW9uIHBhZ2U6Ci0JPG9sPgotCQk8bGk+T3V0cHV0IERpcmVjdG9yeTogU3BlY2lmeSB0aGUgc291cmNlIGZvbGRlciBpbiB0aGUgc2VydmljZSBwcm9qZWN0IGludG8gd2hpY2ggdGhlIGNvZGUgaXMgZ2VuZXJhdGVkLjwvbGk+Ci0JCTxsaT5QYWNrYWdlIE5hbWU6IFR5cGUgdGhlIEphdmEgcGFja2FnZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlLjwvbGk+Ci0JCTxsaT5TcGVjaWZ5IFdTREwgTmFtZXNwYWNlIHRvIFBhY2thZ2UgTmFtZSBNYXBwaW5nczogT3B0aW9uYWxseSBzcGVjaWZ5IFdTREwgbmFtZXNwYWNlIG1hcHBpbmdzIHRvIEphdmEgcGFja2FnZSBuYW1lcy48L2xpPgotCQk8bGk+U2VydmljZSBOYW1lOiBTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBXU0RMIHNlcnZpY2UgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBjb2RlLiBUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBldmVyeSBzZXJ2aWNlIGluIHRoZSBXU0RMIGRvY3VtZW50LjwvbGk+Ci0JCTxsaT5CaW5kaW5nIEZpbGVzOiBTcGVjaWZ5IG9uZSBvciBtb3JlIEpBWC1XUyBvciBKQVhCIGJpbmRpbmcgZmlsZXMuPC9saT4KLQk8L29sPgotCTwvbGk+Ci0JPGxpPkNsaWNrIDxiPk5leHQgJmd0OzwvYj4gdG8gbW92ZSB0byB0aGUgc2Vjb25kIEFwYWNoZSBDWEYgd3NkbDJqYXZhIGNvbmZpZ3VyYXRpb24gcGFnZSB3aGljaCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRoZSA8YSBocmVmPSIuLi9yZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sIj53c2RsMmphdmE8L2E+IGRlZmF1bHQgcHJlZmVyZW5jZXM6Ci0JPHA+RW5zdXJlIHRoYXQgdGhlIDxiPkdlbmVyYXRlIEltcGxlbWVudGF0aW9uPC9iPiBjaGVjayBib3ggaXMgc2VsZWN0ZWQgYW5kIGNsaWNrIDxiPk5leHQgJmd0OzwvYj4KLQk8L2xpPgotCTxsaT5UZXN0IFdlYiBTZXJ2aWNlIHBhZ2UuIFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgc2VydmljZSBzbGlkZXIgb24gdGhlIGZpcnN0IHBhZ2Ugd2FzIHNldCB0byBUZXN0IHNlcnZpY2UuCi0JPHA+U2VsZWN0IHRoZSBsYXVuY2ggYnV0dG9uIHRvIHRlc3QgdGhlIFdlYiBTZXJ2aWNlIHdpdGggdGhlIDxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkuZG9jLnVzZXIvdGFza3MvdHRlc3R3c2RsLmh0bWwiPldlYiBTZXJ2aWNlcyBFeHBsb3JlcjwvYT4uPC9wPgotCTwvbGk+Ci0JPGxpPkFwYWNoZSBDWEYgSkFYLVdTIGNsaWVudCBjb25maWd1cmF0aW9uIHBhZ2U6IFRoaXMgcGFnZSB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgY2xpZW50IHNsaWRlciBvbiB0aGUgV2ViIHNlcnZpY2VzIHBhZ2Ugd2FzIHNldCB0byA8Yj5EZXZlbG9wIGNsaWVudDwvYj4uCi0JPHA+UmVmZXIgdG8gdGhlIDxhIGhyZWY9Ii4vY3JlYXRlX2NsaWVudC5odG1sIj5DcmVhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50PC9hPiBwYWdlIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgb3B0aW9ucyBkaXNwbGF5ZWQgb24gdGhpcyBwYWdlLjwvcD4KLQk8L2xpPgotCTxsaT5XZWIgU2VydmljZSBQdWJsaWNhdGlvbiBQYWdlOiBTZWxlY3Qgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gcHVibGlzaCB0aGlzIFdlYiBzZXJ2aWNlIHRvIGEgVURESSByZWdpc3RyeS4gQ2xpY2sgPGI+RmluaXNoPC9iPjwvbGk+Ci08L29sPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9Ii4uL3Rhc2tzL2NyZWF0ZV9ib3R0b211cC5odG1sIj5DcmVhdGUgYSBXZWIgU2VydmljZSBmcm9tIGEgSmF2YSBpbXBsZW1lbnRhdGlvbiBiZWFuIHVzaW5nIEFwYWNoZSBDWEY8L2E+PGJyPgotPGEgaHJlZj0iLi4vdGFza3MvY3JlYXRlX2NsaWVudC5odG1sIj5HZW5lcmF0ZSBhIEpBWC1XUyBXZWIgU2VydmljZSBDbGllbnQgZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRjwvYT48YnI+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9hbm5vdGF0aW9uX3Byb2Nlc3NpbmcucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9hbm5vdGF0aW9uX3Byb2Nlc3NpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Yjk1NGQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYW5ub3RhdGlvbl9wcm9jZXNzaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYm90dG9tX3VwX3dpemFyZC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2JvdHRvbV91cF93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyN2RjM2I0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvYm90dG9tX3VwX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2ZhY2V0X2NvbmZpZ3VyYXRpb24ucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9mYWNldF9jb25maWd1cmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDM3YzkxYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL2ZhY2V0X2NvbmZpZ3VyYXRpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9tb2R1bGVfZGVwZW5kZW5jaWVzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvbW9kdWxlX2RlcGVuZGVuY2llcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUyNGFkOWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9tb2R1bGVfZGVwZW5kZW5jaWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvcHJvamVjdF9mYWNldHMucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9wcm9qZWN0X2ZhY2V0cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA5MTc5OTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy9wcm9qZWN0X2ZhY2V0cy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3RvcF9kb3duX3dpemFyZC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvaW1hZ2VzL3RvcF9kb3duX3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNzE5MWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy90b3BfZG93bl93aXphcmQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbWFnZXMvd3NfY2xpZW50X3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2Y2MyMmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2ltYWdlcy93c19jbGllbnRfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2luc3RhbGxfY3hmX2ZhY2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDViMjhlOTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3Rhc2tzL2luc3RhbGxfY3hmX2ZhY2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+SW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQ8L2gyPgotPHA+VGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZW5hYmxlIGEgRHluYW1pYyBXZWIgUHJvamVjdCBmb3IgQ1hGIFdlYiBzZXJ2aWNlcyBkZXZlbG9wbWVudC48cD4KLTxvbD4KLTxsaT5MZXQgdGhlIFdlYiBTZXJ2aWNlcyB3aXphcmRzIGRvIGl0IGZvciB5b3UgYXV0b21hdGljYWxseSB3aGVuIGNyZWF0aW5nIGEgV2ViIHNlcnZpY2Ugd2l0aCBBcGFjaGUgQ1hGLjwvbGk+Ci08bGk+U2VsZWN0IGEgQ1hGIHByb2plY3QgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgYW5vdGhlciBjb25maWd1cmF0aW9uIHdoZW4gY3JlYXRpbmcgYSBuZXcgRHluYW1pYyBXZWIgUHJvamVjdAotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2ZhY2V0X2NvbmZpZ3VyYXRpb24ucG5nIiBhbHQ9IlByb2plY3QgQ29uZmlndXJhdGlvbiIgPiA8L3A+PC9saT4KLTxsaT5SaWdodC1jbGljayBvbiBhIER5bmFtaWMgV2ViIFByb2plY3QgYW5kIGNob29zZSA8Yj5Qcm9wZXJ0aWVzPC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuPGJyLz4gT24gdGhlIHRoZSA8Yj5Qcm9qZWN0IEZhY2V0czwvYj4gCi0gcHJvcGVydGllcyBwYWdlIHNlbGVjdCB0aGUgPGI+Q1hGIDIueCBXZWIgU2VydmljZXM8L2I+IGZhY2V0IGluIHRoZSBsaXN0IGFuZCBjbGljayA8Yj5PSzwvYj4uCi0gPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3Byb2plY3RfZmFjZXRzLnBuZyIgYWx0PSJQcm9qZWN0IEZhY2V0cyIgPiA8L3A+PC9saT4KLTwvb2w+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9tYW5hZ2VfY3hmX2xpYl9leHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzA3ZDU4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvbWFuYWdlX2N4Zl9saWJfZXhwb3J0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIj4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TWFuYWdlIHRoZSBleHBvcnRpbmcgb2YgQ1hGIGxpYnJhcmllcyBhdCBkZXBsb3ltZW50IHRpbWU8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+TWFuYWdlIHRoZSBleHBvcnRpbmcgb2YgQ1hGIGxpYnJhcmllcyBhdCBkZXBsb3ltZW50IHRpbWU8L2gyPgotPHA+QnkgZGVmYXVsdCBwcm9qZWN0cyBjb25maWd1cmVkIHdpdGggdGhlIENYRiBmYWNldCBhcmUgc2V0dXAgdG8gcmVzb2x2ZSB0aGUgQ1hGIGxpYnJhcmllcyB0byB0aGUgV0VCLUlORi9saWIgZm9sZGVyIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5UaGlzIGhvd2V2ZXIgZ3JlYXRseSBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGRlcGxveWVkIHdlYiBtb2R1bGUuIElmIHRoZSB3ZWIgb3IgYXBwbGljYXRpb24gc2VydmVyIHlvdSBhcmUgZGVwbG95aW5nIHRvIGlzIGFscmVhZHkgY29uZmlndXJlZCB3aXRoIHRoZSBBcGFjaGUgQ1hGIGxpYnJhcmllcyB5b3UKLWNhbiBkaXNhYmxlIHRoaXMgb3B0aW9uIGluIHRoZSBBcGFjaGUgQ1hGIHByZWZlcmVuY2VzLjwvcD4KLTxwPlRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGV4aXN0aW5nIDxiPkR5bmFtaWMgV2ViIFByb2plY3Q8L2I+IGFscmVhZHkgY29uZmlndXJlZCB3aXRoIHRoZSBDWEYgRmFjZXQgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QgYW5kIGNob29zZSA8Yj5Qcm9wZXJ0aWVzPC9iPi48YnIvPjwvcD4KLTxwPjxpbWcgc3JjPSIuL2ltYWdlcy9tb2R1bGVfZGVwZW5kZW5jaWVzLnBuZyIgYWx0PSJNb2R1bGUgRGVwZW5kZW5jaWVzIj48L3A+Ci1TZWxlY3QgdGhlIDxiPkphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llczwvYj4gcHJvcGVydGllcyBwYWdlIGFuZCBzZWxlY3Qgb3IgZGVzZWxlY3QgdGhlIHZlcnNpb24gb2YgdGhlIDxiPkFwYWNoZSBDWEYgTGlicmFyeTwvYj4gdGhhdCBpcyBjb25maWd1cmVkIGluIHRoZSBwcm9qZWN0IGFuZCBjbGljayA8Yj5PSzwvYj4uCi08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9jeGZfZmFjZXQuaHRtbCI+Q1hGIFByb2plY3QgRmFjZXQ8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NnZXR0aW5nc3RhcnRlZC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYzZiNjc0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2NnZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89InRvYy54bWwjZ2V0dGluZ3N0YXJ0ZWQiPiAKLSAgICA8dG9waWMgbGFiZWw9IlF1aWNrIFN0YXJ0IiBocmVmPSJnZXR0aW5nc3RhcnRlZC9xdWlja3N0YXJ0Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODRmZDRjNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89InRvYy54bWwjcmVmZXJlbmNlIj4gCi0JPHRvcGljIGxhYmVsPSJQcmVmZXJlbmNlcyIgaHJlZj0icmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiPgotICAgICAgICA8dG9waWMgbGFiZWw9IkphdmEyV1MiIGhyZWY9InJlZmVyZW5jZS9qYXZhMndzX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBsYWJlbD0iV1NETDJKYXZhIiBocmVmPSJyZWZlcmVuY2Uvd3NkbDJqYXZhX3RhYi5odG1sIi8+Ci0gICAgICAgIDx0b3BpYyBsYWJlbD0iSkFYLVdTIiBocmVmPSJyZWZlcmVuY2UvamF4d3NfdGFiLmh0bWwiLz4KLSAgICAgICAgPHRvcGljIGxhYmVsPSJFbmRwb2ludCBDb25maWciIGhyZWY9InJlZmVyZW5jZS9lbmRwb2ludF9jb25maWdfdGFiLmh0bWwiLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZS9zZXJ2ZXJfcnVudGltZS5odG1sIiBsYWJlbD0iU2VydmVyIGFuZCBydW50aW1lIj4KLSAgICAgICAgPC90b3BpYz4KLSAgICA8L3RvcGljPgotIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvY3hmX2ZhY2V0Lmh0bWwiIGxhYmVsPSJDWEYgUHJvamVjdCBGYWNldCI+Ci0gPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3Rhc2tzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM1ODI4ZjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJUYXNrcyIgbGlua190bz0idG9jLnhtbCN0YXNrcyI+IAotCTx0b3BpYyBocmVmPSJ0YXNrcy9jcmVhdGVfY3hmX3Byb2plY3QuaHRtbCIgbGFiZWw9IkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXMiPgotICAgIDx0b3BpYyBocmVmPSJ0YXNrcy9pbnN0YWxsX2N4Zl9mYWNldC5odG1sIiBsYWJlbD0iSW5zdGFsbCB0aGUgQ1hGIFByb2plY3QgRmFjZXQiPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzL21hbmFnZV9jeGZfbGliX2V4cG9ydC5odG1sIiBsYWJlbD0iTWFuYWdlIHRoZSBleHBvcnRpbmcgb2YgQ1hGIGxpYnJhcmllcyBkdXJpbmcgZGVwbG95bWVudCI+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgaHJlZj0idGFza3MvY29uZmlndXJpbmdfamF4d3NfYW5ub3RhdGlvbl9wcm9jZXNzaW5nLmh0bWwiIGxhYmVsPSJFbmFibGUgSkFYLVdTIEFubm90YXRpb24gUHJvY2Vzc2luZyI+Ci0gICAgPC90b3BpYz4KLSA8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgV2ViIFNlcnZpY2UgZnJvbSBhIEphdmEgaW1wbGVtZW50YXRpb24gYmVhbiB1c2luZyBBcGFjaGUgQ1hGIiBocmVmPSJ0YXNrcy9jcmVhdGVfYm90dG9tdXAuaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgYW4gU0VJIGFuZCBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGJlYW4gZnJvbSBhIFdTREwgZG9jdW1lbnQgdXNpbmcgQXBhY2hlIENYRiIgaHJlZj0idGFza3MvY3JlYXRlX3RvcGRvd24uaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgYSBKQVgtV1MgV2ViIFNlcnZpY2UgQ2xpZW50IGZyb20gYSBXU0RMIGRvY3VtZW50IHVzaW5nIEFwYWNoZSBDWEYiIGhyZWY9InRhc2tzL2NyZWF0ZV9jbGllbnQuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiODAwMjYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMWY5MDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMC41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHM7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYjdlMTNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIg0KLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPg0KLTxoZWFkPg0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4NCi08dGl0bGU+QWJvdXQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keSBsYW5nPSJFTi1VUyI+DQotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+DQotIA0KLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkNCi08aDM+TGljZW5zZTwvaDM+DQotDQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgDQotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgDQotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4NCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPg0KLQ0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgDQotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQ0KLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyANCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UNCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudA0KLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPg0KLQ0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDdlMmI1Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLUBpbXBvcnQgIi4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotc3Bhbi5jb250cm9sIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ubmFtZSB7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5jb2RlIHsKLSAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLX0KLQotcC5uYXZfZm9vdGVyIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotcC5uYXZfZm9vdGVyIGEgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYmU5NjQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAqLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGJvb2suY3NzLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzLyxcCi0gICAgICAgICAgICAgICBnZXR0aW5nc3RhcnRlZC8sXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBtYWlucGFnZS5odG1sLFwKLSAgICAgICAgICAgICAgIGxlZ2FsLmh0bWwsXAotICAgICAgICAgICAgICAgdGlwcy8sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvY29uY2VwdHMvamF4d3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2NvbmNlcHRzL2pheHdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQyOTliNzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvY29uY2VwdHMvamF4d3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0gICAgPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5KYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYiBTZXJ2aWNlczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5KYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYiBTZXJ2aWNlczwvaDI+Ci08cD5KQVgtV1MgaXMgYSBKYXZhIEFQSSBmb3IgY3JlYXRpbmcgV2ViIHNlcnZpY2VzIGFuZCBjbGllbnRzIHRoYXQgY29tbXVuaWNhdGUgdXNpbmcgWE1MLiBJdCB3YXMgZGVzaWduZWQgdG8gc3VwZXJzZWRlIHRoZSBKQVgtUlBDIHN0YW5kYXJkLjwvcD4KLQotPHA+QWRkaXRpb25hbCBpbmZvcm1hdGlvbjo8L3A+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjQiPkpTUi0yMjQgU3BlY2lmaWNhdGlvbjwvYT48L2xpPgotPC91bD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMDgyZGQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkdldHRpbmcgU3RhcnRlZDwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5HZXR0aW5nIFN0YXJ0ZWQ8L2gyPgotPHA+VGhpcyBzZWN0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGdldHRpbmcgc3RhcnRpbmcgc3RhcnRlZCB3aXRoIEpBWC1XUyBUb29scy48L3A+Ci08dWw+Ci0JPGxpPgotCTxwPjxhIGhyZWY9InJlcXVpcmVtZW50cy5odG1sIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci0JPC9saT4KLQk8bGk+Ci0JPHA+PGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvcmVmZXJlbmNlL3ByZWZlcmVuY2VzLmh0bWwiPkNvbmZpZ3VyaW5nIEFwYWNoZSBDWEYgaW4gdGhlIHdvcmtiZW5jaDwvYT48L3A+Ci0JPC9saT4KLQk8bGk+Ci0JPHA+PGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvZ2V0dGluZ3N0YXJ0ZWQvcXVpY2tzdGFydC5odG1sIj5KQVgtV1MgVG9vbHMgUXVpY2sgU3RhcnQ8L2E+PC9wPgotCTwvbGk+Ci08L3VsPgotPHA+Rm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCB0aGUgPGEgaHJlZj0iaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvSkFYV1MiPkpBWC1XUyBXaWtpPC9hPiBwYWdlLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9nZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4Njg3YjNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2dldHRpbmdzdGFydGVkL3JlcXVpcmVtZW50cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLQk8bGluayBocmVmPSIuLi9ib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC9oMj4KLTxwPkpBWC1XUyBUb29scyBjdXJyZW50bHkgc3VwcG9ydHMgYm90aCBFY2xpcHNlIDMuNCBhbmQgMy41IGVudmlyb25tZW50cyBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgPGk+bWluaW11bTwvaT4gcmVxdWlyZW1lbnRzLjwvcD4KLTxwPjwvcD4KLTx1bD4KLQk8bGk+Ci0JPHA+RWNsaXBzZSAzLjQuMCAoPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2FkczwvYT4pPC9wPgotCTwvbGk+Ci0JPGxpPgotCTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIDMuMC4xICg8YSBocmVmPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvZG93bmxvYWRzLyI+aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL2Rvd25sb2FkczwvYT4pPC9wPgotCTwvbGk+Ci08L3VsPgotCi08aDM+SkRLIFZlcnNpb25zPC9oMz4KLTxwPkphdmEgNS4wIGlzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gYW5kIEpESyA2LjAgaXMgc3VwcG9ydGVkIGZyb20gdXBkYXRlIDQgYW5kIGxhdGVyLjwvcD4KLTxwPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlL2Rvd25sb2Fkcy8iPmh0dHA6Ly9qYXZhLnN1bi5jb20vamF2YXNlL2Rvd25sb2Fkcy88L2E+PC9wPgotCi0KLTxoMz5KQVgtV1MgUnVudGltZTwvaDM+Ci08cD5CZWZvcmUgY3JlYXRpbmcgV2ViIHNlcnZpY2UgYXBwbGljYXRpb25zIHdpdGggSkFYLVdTIFRvb2xzIGEgSkFYLVdTIHJ1bnRpbWUgbXVzdCBiZSBkb3dubG9hZGVkLCBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQgaW4gdGhlIHdvcmtiZW5jaC48L3A+Ci08cD5DdXJyZW50bHkgd2Ugc3VwcG9ydCB0aGUgQXBhY2hlIENYRiBydW50aW1lIGZvciBKQVgtV1MgZGV2ZWxvcG1lbnQgZnJvbSB2ZXJzaW9uIDIuMC42IHVwd2FyZHMuIFdlIHJlY29tbWVuZCB1c2luZyBhIHZlcnNpb24gZnJvbQotdGhlIENYRiAyLjEueCBvciB0aGUgY3VycmVudCAyLjIueCBzdHJlYW0uPC9wPgotPHA+VGhlIEFwYWNoZSBDWEYgcnVudGltZSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vY3hmLmFwYWNoZS5vcmcvZG93bmxvYWQuaHRtbCI+QXBhY2hlIENYRiBEb3dubG9hZHM8L2E+IHBhZ2UuPHA+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIGJvcmRlcj0iMCIgPjwvcD4KLTxhIGhyZWY9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3JlZmVyZW5jZS9wcmVmZXJlbmNlcy5odG1sIj5BcGFjaGUgQ1hGIDIueCBQcmVmZXJlbmNlczwvYT48YnI+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgYm9yZGVyPSIwIiA+PC9wPgotPGEgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdGFza3MvY3JlYXRlX2N4Zl9wcm9qZWN0Lmh0bWwiPkNyZWF0ZSBhIHByb2plY3QgZm9yIENYRiBXZWIgc2VydmljZXM8L2E+PGJyPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9lZ2ctaW5jdWJhdGlvbi5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvZWdnLWluY3ViYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NjFjOTgxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9lZ2ctaW5jdWJhdGlvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxjLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxNjFlM2FhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsci5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDcyNmY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy9uZ3JlbHQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc0YmVlMmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvaW1hZ2VzL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9pbWFnZXMvd3RwbG9nb3NtYWxsLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy93dHBsb2dvc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MWJlYTc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2ltYWdlcy93dHBsb2dvc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbGVnYWwuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL2xlZ2FsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxMmZjZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbGVnYWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkxlZ2FsPC90aXRsZT4KLQk8bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0JPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9IlBMVUdJTlNfUk9PVC9vcmcuZWNsaXBzZS5oZWxwL2xpdmVoZWxwLmpzIj48L3NjcmlwdD4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+TGVnYWw8L2gyPgotPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA5LCBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgotPHA+VGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbWFpbnBhZ2UuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL21haW5wYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwYTk4YzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvbWFpbnBhZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgotPGhlYWQ+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkpBWC1XUyBUb29scyBVc2VyIEd1aWRlPC90aXRsZT4KLQk8bGluayBocmVmPSJib29rLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiBjaGFyc2V0PSJJU08tODg1OS0xIiB0eXBlPSJ0ZXh0L2NzcyI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCTxkaXYgYWxpZ249ImNlbnRlciI+Ci0JCTxicj4KLQkJPGltZyBhbHQ9IldlYlRvb2xzIFBsYXRmb3JtIiBzcmM9ImltYWdlcy93dHBsb2dvc21hbGwuanBnIiBoc3BhY2U9IjcwIj4KLQkJPGltZyBhbHQ9IldlYlRvb2xzIFBsYXRmb3JtIiBzcmM9ImltYWdlcy9lZ2ctaW5jdWJhdGlvbi5wbmciIGhzcGFjZT0iMTAwIj4KLQkJPGJyPgotCQk8aDE+SkFYLVdTIFRvb2xzIFVzZXIgR3VpZGU8L2gxPgotCTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ1OGNkYjEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgVXNlciBHdWlkZSAoSW5jdWJhdGlvbikNCi1wbHVnaW5Qcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQ0KLQ0KLWNoZWF0c2hlZXQuY2F0ZWdvcnkuamF4d3M9SkFYLVdTIERldmVsb3BtZW50DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDExNGNlNDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/Pg0KLTxwbHVnaW4+DQotDQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIvPg0KLSAgICAgIDx0b2MgZmlsZT0idG9jY29uY2VwdHMueG1sIi8+DQotICAgICAgPHRvYyBmaWxlPSJ0b2N0YXNrcy54bWwiLz4NCi0gICAgICA8dG9jIGZpbGU9InRvY3JlZmVyZW5jZS54bWwiLz4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCI+DQotICAgICAgPGNhdGVnb3J5DQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cyINCi0gICAgICAgICAgICBuYW1lPSIlY2hlYXRzaGVldC5jYXRlZ29yeS5qYXh3cyI+DQotICAgICAgPC9jYXRlZ29yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICANCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMwMjJkMTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fcHJvY2Vzc29ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyI+Ci0JPHRpdGxlPkFubm90YXRpb24gUHJvY2Vzc29yczwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj5Bbm5vdGF0aW9uIFZhbGlkYXRpb248L2gyPgotPHA+SkFYLVdTIFRvb2xzIHByb3ZpZGVzIEpEVC1BUFQgQW5ub3RhdGlvbiBQcm9jZXNzb3JzIHRoYXQgZ2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzb3VyY2UgY29kZSBhcyBpdCBpcyBiZWluZyBlZGl0ZWQuPC9wPgotPHA+VGhlIHByb2Nlc3NvcnMgcmVwb3J0IGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIFByb2JsZW1zIFZpZXcgd2hlbiBKQVgtV1MgcnVsZXMgYXJlIGJyb2tlbi48L3A+IAotPHA+SkFYLVdTIEFubm90YXRpb24gcHJvY2Vzc2luZyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LjwvcD4KLTxwPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiBib3JkZXI9IjAiID48L3A+Ci08YSBocmVmPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90YXNrcy9jb25maWd1cmluZ19qYXh3c19hbm5vdGF0aW9uX3Byb2Nlc3NpbmcuaHRtbCI+RW5hYmxlIEpBWC1XUyBBbm5vdGF0aW9uIFByb2Nlc3Npbmc8L2E+PGJyPiAgICAKLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl92aWV3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvYW5ub3RhdGlvbl92aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZhZTNkOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2Fubm90YXRpb25fdmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPkFubm90YXRpb25zIFZpZXc8L3RpdGxlPgotCTxsaW5rIGhyZWY9Ii4uL2Jvb2suY3NzIiByZWw9InN0eWxlc2hlZXQiIGNoYXJzZXQ9IklTTy04ODU5LTEiIHR5cGU9InRleHQvY3NzIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+QW5ub3RhdGlvbiBQcm9wZXJ0aWVzIFZpZXc8L2gyPgotPHA+SkFYLVdTIFRvb2xzIHByb3ZpZGVzIGEgY29udGV4dCBhd2FyZSBBbm5vdGF0aW9uIHByb3BlcnRpZXMgdmlldyB0aGF0IHJlYWN0cyB0byB0aGUgc2VsZWN0aW9uIGluIHRoZSBKYXZhIAotRWRpdG9yIHByZXNlbnRpbmcgYSBsaXN0IG9mIGFwcGxpY2FibGUgSkFYLVdTIGFubm90YXRpb25zIGZvciB0aGF0IHNlbGVjdGlvbi48L3A+Ci08cD5TZWxlY3Rpbmcgb3IgZGVzZWxlY3RpbmcgYSBjaGVjayBib3ggaW4gdGhlIHZhbHVlcyBjb2x1bW4gd2lsbCBhZGQgb3IgcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGF0IHRoYXQgcm93IAotdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQgaW4gdGhlIEphdmEgRWRpdG9yPC9wPgotPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXcucG5nIiBhbHQ9IkFubm90YXRpb24gcHJvcGVydGllcyB2aWV3IiA+IDwvcD4KLTxwPkV4cGFuZGluZyBhbiBhbm5vdGF0aW9uIGluIHRoZSB2aWV3IHdpbGwgcmV2ZWFsIHRoZSBhbm5vdGF0aW9ucyBlbGVtZW50cyBhbmQgdGhlIGVsZW1lbnQgdmFsdWVzLjwvcD4KLTxwPllvdSBjYW4gZWRpdCB0aGUgYW5ub3RhdGlvbiBlbGVtZW50IHZhbHVlcyB1c2luZyB0aGUgZWRpdG9ycyBpbiB0aGUgdmFsdWVzIGNvbHVtbi48L3A+Ci08cD48aW1nIHNyYz0iLi9pbWFnZXMvYW5ub3RhdGlvbnNfdmlld19leHBhbmRlZC5wbmciIGFsdD0iQW5ub3RhdGlvbiBwcm9wZXJ0aWVzIHZpZXcgZXhwYW5kZWQiID4gPC9wPgotPHA+VGhlIDxzdHJvbmc+QW5ub3RhdGlvbiBQcm9wZXJ0aWVzPC9zdHJvbmc+IHZpZXcgaXMgYXZhaWxhYmxlIHVuZGVyCi08YSBjbGFzcz0iY29tbWFuZC1saW5rIiBocmVmPSdqYXZhc2NyaXB0OmV4ZWN1dGVDb21tYW5kKCJvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93VmlldyhvcmcuZWNsaXBzZS51aS52aWV3cy5zaG93Vmlldy52aWV3SWQ9b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpLnZpZXdzLkFubm90YXRpb25zVmlldykiKSc+Ci08aW1nIHNyYz0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmhlbHAvY29tbWFuZF9saW5rLnBuZyIgYWx0PSJPcGVuIHRoZSBhbm5vdGF0aW9uIHByb3BlcnRpZXMgdmlldyI+PHN0cm9uZz5XaW5kb3cgJmd0OyBTaG93IFZpZXcgJmd0OyBPdGhlci4uLiAmZ3Q7IEpBWC1XUyAmZ3Q7IEFubm90YXRpb24gUHJvcGVydGllczwvc3Ryb25nPjwvYT4gZnJvbSB0aGUgdG9wIGxldmVsIG1lbnUuIDwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzM2Yjk2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3JlZmVyZW5jZS9pbWFnZXMvYW5ub3RhdGlvbnNfdmlldy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXdfZXhwYW5kZWQucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvcmVmZXJlbmNlL2ltYWdlcy9hbm5vdGF0aW9uc192aWV3X2V4cGFuZGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODk0ZTUzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci9yZWZlcmVuY2UvaW1hZ2VzL2Fubm90YXRpb25zX3ZpZXdfZXhwYW5kZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDQ3ZjI3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL2NvbnRlbnRfYXNzaXN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RpcHMvaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmNhNGMxYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL2ltYWdlcy9xdWlja19maXhlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL3RpcHNfdHJpY2tzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90aXBzL3RpcHNfdHJpY2tzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkyZDcxNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdGlwcy90aXBzX3RyaWNrcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiI+Ci0JPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0JPHRpdGxlPlRpcHMgYW5kIHRyaWNrcyAoSkFYLVdTIFRvb2xzKTwvdGl0bGU+Ci0JPGxpbmsgaHJlZj0iLi4vYm9vay5jc3MiIHJlbD0ic3R5bGVzaGVldCIgY2hhcnNldD0iSVNPLTg4NTktMSIgdHlwZT0idGV4dC9jc3MiPgotCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJQTFVHSU5TX1JPT1Qvb3JnLmVjbGlwc2UuaGVscC9saXZlaGVscC5qcyI+PC9zY3JpcHQ+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPlRpcHMgYW5kIHRyaWNrcyAoSkFYLVdTIFRvb2xzKTwvaDI+Ci08cD5UaGUgZm9sbG93aW5nIHRpcHMgYW5kIHRyaWNrcyBnaXZlIHNvbWUgaGVscGZ1bCBpZGVhcyBmb3IgaW5jcmVhc2luZyB5b3VyIHByb2R1Y3Rpdml0eS48L3A+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1IiBzdW1tYXJ5PSJKYXZhIHNlYXJjaCBhY3Rpb25zIj4KLSAgICAgIDx0Ym9keT4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD48Yj5Db250ZW50IEFzc2lzdDwvYj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5Db250ZW50IGFzc2lzdCBwcm92aWRlcyB5b3Ugd2l0aCBhIGxpc3Qgb2YgcHJvcG9zYWxzIGlmIGF2YWlsYWJsZSBvciB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIGFzIG91dGxpbmVkIGluIHRoZSBKQVgtV1Mgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBhbm5vdGF0aW9ucyBlbGVtZW50LgotICAgICAgICAgICAgSW4gdGhlIEphdmEgZWRpdG9yIHByZXNzIDxiPkN0cmwrU3BhY2U8L2I+IG9yIHVzZSA8Yj5FZGl0ICZndDsgQ29udGVudCBBc3Npc3QgICZndDsgSkFYLVdTIFByb3Bvc2FsczwvYj4gd2hlbiB0aGUgY3Vyc29yIGlzIGJldHdlZW4gdGhlIHF1b3RhdGlvbiBtYXJrcyBvZiBhbiBhbm5vdGF0aW9ucyBlbGVtZW50IFN0cmluZyB2YWx1ZQotICAgICAgICAgICAgb3IgZGlyZWN0bHkgYWZ0ZXIgdGhlICc9JyBzaW1wbGUgYXNzaWdubWVudCBvcGVyYXRvci48L3A+Ci0gICAgICAgICAgICA8cD48aW1nIHNyYz0iLi9pbWFnZXMvY29udGVudF9hc3Npc3QucG5nIiBhbHQ9IkNvbnRlbnQgQXNzaXN0IiA+IDwvcD4KLSAgICAgICAgICAgIAotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPHA+PGI+VXNlIFF1aWNrIEZpeGVzIHRvIHJlc29sdmUgSkFYLVdTIHZhbGlkYXRpb24gZXJyb3JzPC9iPjwvcD4KLSAgICAgICAgICA8L3RkPgotCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIDxwPldpdGggPGI+QW5ub3RhdGlvbiBQcm9jZXNzaW5nPC9iPiBlbmFibGVkIG9uIGEgcHJvamVjdCB0aGUgSkFYLVdTIGFubm90YXRpb24gcHJvY2Vzc29ycyByZXBvcnQgZXJyb3JzIGFuZCB3YXJuaW5nIHdoZW4KLSAgICAgICAgICAgIHJ1bGVzIGFyZSBicm9rZW4uIEEgbnVtYmVyIG9mIHRoZXNlIHJ1bGVzIGFyZSByZXBvcnRlZCBhcyBmaXhhYmxlIGVycm9ycyBhbmQgd2FybmluZ3MuPC9wPgotICAgICAgICAgICAgPHA+PGltZyBzcmM9Ii4vaW1hZ2VzL3F1aWNrX2ZpeGVzLnBuZyIgYWx0PSJRdWljayBGaXhlcyIgPiA8L3A+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD48Yj5Jbml0aWFsaXplIHRoZSBXZWIgU2VydmljZXMgd2l6YXJkczwvYj48L3A+Ci0gICAgICAgICAgPC90ZD4KLQotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICA8cD5MYXVuY2ggdGhlIFdlYiBTZXJ2aWNlIGFuZCBXZWIgU2VydmljZSBDbGllbnQgd2l6YXJkcyBmcm9tIHRoZSBjb250ZXh0IG1lbnUgdG8gaW5pdGlhbGl6ZSB0aGUgd2l6YXJkIGZpZWxkcy4gCi0gICAgICAgICAgICBSaWdodC1jbGljayBvbiBhIEphdmEgSW1wbGVtZW50YXRpb24gYmVhbiBhbmQgc2VsZWN0IDxiPldlYiBTZXJ2aWNlcyA+IENyZWF0ZSBXZWIgU2VydmljZTwvYj4uIAotICAgICAgICAgICAgRm9yIGEgV1NETCBkb2N1bWVudCByaWdodC1jbGljayBhbmQgc2VsZWN0IDxiPldlYiBTZXJ2aWNlcyA+IEdlbmVyYXRlIEphdmEgYmVhbiBza2VsZXRvbjwvYj4uCi0gICAgICAgICAgICBUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUgJnF1b3Q7V2ViIHNlcnZpY2UgdHlwZSZxdW90OywgdGhlICZxdW90O1NlcnZpY2UgaW1wbGVtZW50YXRpb24mcXVvdDsgb3IgJnF1b3Q7U2VydmljZSBkZWZpbml0aW9uJnF1b3Q7IGZpZWxkcwotICAgICAgICAgICAgYW5kIHRoZSAmcXVvdDtTZXJ2aWNlIHByb2plY3QmcXVvdDsgZmllbGQuPC9wPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZDc1ZGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJKQVgtV1MgVG9vbHMgVXNlciBHdWlkZSIgdG9waWM9Im1haW5wYWdlLmh0bWwiPgotICAgPHRvcGljIGhyZWY9ImdldHRpbmdzdGFydGVkL2dldHRpbmdfc3RhcnRlZC5odG1sIiBsYWJlbD0iR2V0dGluZyBTdGFydGVkIj4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nc3RhcnRlZC9yZXF1aXJlbWVudHMuaHRtbCIgbGFiZWw9IlJlcXVpcmVtZW50cyBhbmQgSW5zdGFsbGF0aW9uIi8+Ci0gICAgICA8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZG9jLnVzZXIvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sIi8+Ci0gICAgICA8YW5jaG9yIGlkPSJnZXR0aW5nc3RhcnRlZCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiPgotICAgICAgPGFuY2hvciBpZD0iY29uY2VwdHMiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2tzIj4KLSAgICAgIDxhbmNob3IgaWQ9InRhc2tzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJSZWZlcmVuY2UiPgotICAgICAgPGFuY2hvciBpZD0icmVmZXJlbmNlIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGhyZWY9InRpcHMvdGlwc190cmlja3MuaHRtbCIgbGFiZWw9IlRpcHMgYW5kIHRyaWNrcyI+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGhyZWY9ImxlZ2FsLmh0bWwiIGxhYmVsPSJMZWdhbCI+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2Njb25jZXB0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2Njb25jZXB0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA4NjVjYzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iQ29uY2VwdHMiIGxpbmtfdG89InRvYy54bWwjY29uY2VwdHMiPgotICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzL2pheHdzLmh0bWwiIGxhYmVsPSJKYXZhIEFQSSBmb3IgWE1MLUJhc2VkIFdlYiBTZXJ2aWNlcyI+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZmQwYTFjOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb2MudXNlci90b2NyZWZlcmVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlJlZmVyZW5jZSIgbGlua190bz0idG9jLnhtbCNyZWZlcmVuY2UiPgotICAgPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyL3RvY3JlZmVyZW5jZS54bWwiLz4KLSAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYW5ub3RhdGlvbl9wcm9jZXNzb3JzLmh0bWwiIGxhYmVsPSJBbm5vdGF0aW9uIFZhbGlkYXRpb24iPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UvYW5ub3RhdGlvbl92aWV3Lmh0bWwiIGxhYmVsPSJBbm5vdGF0aW9uIFByb3BlcnRpZXMgVmlldyI+Ci0gICA8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jdGFza3MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMGNkYmM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvYy51c2VyL3RvY3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IlRhc2tzIiBsaW5rX3RvPSJ0b2MueG1sI3Rhc2tzIj4KLSAgIDxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5kb2MudXNlci90b2N0YXNrcy54bWwiLz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4ZGY5Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGUxOWU1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNzljOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUNYRiBXZWIgU2VydmljZXMgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249Q1hGIFdlYiBTZXJ2aWNlcyAKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTENcblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2MmM5MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC40LjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuamRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjE1NiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb25zdW1wdGlvbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYuY29uc3VtcHRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI0NCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMjA0IgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmNyZWF0aW9uLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSI1MiIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5jcmVhdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9Ijk2IgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMTIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC53c2RsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuNi4yLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjQ3MjcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9Y3hmMzIuZ2lmCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDEzNTJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZSAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IElPTkEgVGVjaG5vbG9naWVzIFBMQyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDM0NGQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGN4ZjMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvY3hmMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2N4ZjMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExZWNjYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvY3hmMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGE5ZDAwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZSAoSW5jdWJhdGlvbikKLXBsdWdpblByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTE5ZTUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFjODE0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUNYRiBXZWIgU2VydmljZXMgRGV2ZWxvcGVyIFJlc291cmNlcyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBmb3IgQ1hGIFdlYiBTZXJ2aWNlcwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi0gQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQ1xuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTY5YmYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+U2VwdGVtYmVyIDEyLCAyMDA4PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjQ3MjcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9Y3hmMzIuZ2lmCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDEzNTJlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1DWEYgV2ViIFNlcnZpY2VzIFNvdXJjZSAoSW5jdWJhdGlvbilcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IElPTkEgVGVjaG5vbG9naWVzIFBMQyAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDM0NGQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGN4ZjMyLnBuZywgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vY3hmMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2N4ZjMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExZWNjYi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vY3hmMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWEyZTU4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUNYRiBXZWIgU2VydmljZXMgU291cmNlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTI1MWNlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY4Yjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpzdC53cy5jeGYuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDZiNzliLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElPTkEgVGVjaG5vbG9naWVzIFBMQwotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUNYRiBXZWIgU2VydmljZXMgU0RLIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNYRiBXZWIgU2VydmljZXMgU291cmNlCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDggSU9OQSBUZWNobm9sb2dpZXMgUExDXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElPTkEgVGVjaG5vbG9naWVzIFBMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2NjA2OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjQuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZmQ3MmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlMTllNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYmY3YjEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTEMKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJT05BIFRlY2hub2xvZ2llcyBQTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1DWEYgV2ViIFNlcnZpY2VzIFRlc3RzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUNYRiBXZWIgU2VydmljZXMgVGVzdHMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCBJT05BIFRlY2hub2xvZ2llcyBQTENcblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSU9OQSBUZWNobm9sb2dpZXMgUExDIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3NGQ2MS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMC40LjIucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5jeGZfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQ5YzMwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTYyMjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iQXNzZW1ibHkgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IldlYnRvb2xzIFBsYXRmb3JtIFByb2plY3QiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGZlYXR1cmUgaXMgZm9yIGJ1aWxkaW5nIG9ubHksIHRvIGFzc2VtYmxlIHRoZSByZWxlYXRlZCBmZWF0dXJlcywgd2l0aG91dCBmb3JjZWluZyB0aGVtIHRvIGVuY29kaW5nIGRlcGVuZGVuY2llcyBvbiBlYWNoIG90aGVyLiAKLVRoaXMgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGJ1aWxkIGRpc3RyaWJ1dGlvbnMgb3IgdXBkYXRlIHNpdGVzLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTg5NjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWE4YTFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJBc3NlbWJseSBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iV2VidG9vbHMgUGxhdGZvcm0gUHJvamVjdCI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgIFRoaXMgZmVhdHVyZSBpcyBmb3IgYnVpbGRpbmcgb25seSwgdG8gYXNzZW1ibGUgdGhlIHJlbGVhdGVkIGZlYXR1cmVzLCB3aXRob3V0IGZvcmNlaW5nIHRoZW0gdG8gZW5jb2RpbmcgZGVwZW5kZW5jaWVzIG9uIGVhY2ggb3RoZXIuIAotVGhpcyBmZWF0dXJlIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gYnVpbGQgZGlzdHJpYnV0aW9ucyBvciB1cGRhdGUgc2l0ZXMuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLSAgICAgICAgIAotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zl9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjAzZGIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMzc4OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuYXNzZW1ibHlfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE3YzU0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5hc3NlbWJseV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmFzc2VtYmx5X3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iQXNzZW1ibHkgRmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IldlYnRvb2xzIFBsYXRmb3JtIFByb2plY3QiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICBUaGlzIGZlYXR1cmUgaXMgZm9yIGJ1aWxkaW5nIG9ubHksIHRvIGFzc2VtYmxlIHRoZSByZWxlYXRlZCBmZWF0dXJlcywgd2l0aG91dCBmb3JjZWluZyB0aGVtIHRvIGVuY29kaW5nIGRlcGVuZGVuY2llcyBvbiBlYWNoIG90aGVyLiAKLVRoaXMgZmVhdHVyZSBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIGJ1aWxkIGRpc3RyaWJ1dGlvbnMgb3IgdXBkYXRlIHNpdGVzLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcyAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcyAKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmX3Rlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkNmU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhMmE2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uZmVhdHVyZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiNjE1ZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIERPTSBUb29scyBTREsgKEluY3ViYXRpb24pCi0KLSMgImZlYXR1cmVQcm92aWRlciIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLWZlYXR1cmVQcm92aWRlcj1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SkFYLVdTIERPTSBUb29scyBTb3VyY2UKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIChXVFApIFVwZGF0ZSBTaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDkgU0FQIEFHLCBXYWxsZG9yZi5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGVhNmZkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxOTJhNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTNmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MWM3My4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgRE9NIFRvb2xzIFRlc3RzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBET00gVG9vbHMgVGVzdHMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIChXVFApIFVwZGF0ZSBTaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDkgU0FQIEFHLCBXYWxsZG9yZi5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxNDU4NS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJWZlYXR1cmVQcm92aWRlciIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qbW9jayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb21fdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWI4OGViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjkzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWNlZDkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9SkFYLVdTIFRvb2xzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBUb29scyAKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2ZjkxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLndzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4Lmp3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLmJpbmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4xLjkucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgueG1sLnN0cmVhbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZlZmViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNjE0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KQVgtV1MgVG9vbHMgU291cmNlIChJbmN1YmF0aW9uKVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1N2YxY2IuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgU291cmNlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjkzZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0M2E4YjMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyBEZXZlbG9wZXIgUmVzb3VyY2VzIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGZvciBKQVgtV1MgVG9vbHMgCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLSBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9ZXBsLXYxMC5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWZlZmViLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciBmZWF0dXJlIGRldGFpbHMgaW4gdGhlICJBYm91dCIgCi0jIGRpYWxvZyAodHJhbnNsYXRlZCkuICBNYXhpbXVtIDE1IGxpbmVzIGFuZCA3NSBjaGFyYWN0ZXJzIHBlciBsaW5lLgotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9d3RwX3Byb2QzMi5wbmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNjE0Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1KQVgtV1MgVG9vbHMgU291cmNlIChJbmN1YmF0aW9uKVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA4LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvaW5jdWJhdG9yL1xuXAotXG4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQ1MTJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIHd0cF9wcm9kMzIucG5nLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OGFlYmUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotI3Byb3BlcnRpZXMgZmlsZSBmb3IgSkFYV1MgQ29yZQotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgU291cmNlIChJbmN1YmF0aW9uKQotcGx1Z2luUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZmI0NGEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vd3RwX3Byb2QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi93dHBfcHJvZDMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNlYWIzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3d0cF9wcm9kMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODIzNTMzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTJhOGMuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGYyMzk3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgVG9vbHMgU0RLIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBUb29scyBTb3VyY2UKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJiMjcwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c19zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjUuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3Nfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyMTY1Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWUyYWVmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpBWC1XUyBUb29scyBUZXN0cyAoSW5jdWJhdGlvbikKLQotIyAiZmVhdHVyZVByb3ZpZGVyIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotZmVhdHVyZVByb3ZpZGVyPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KQVgtV1MgVG9vbHMgVGVzdHMKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzLlxuXAotIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLSBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1lcGwtdjEwLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkOWFhNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c190ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjAuNS4yLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVmZWF0dXJlUHJvdmlkZXIiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNGY3NjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTAyNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjA0ZTliLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1KQVgtV1MgVG9vbHMgVXNlciBEb2N1bWVudGF0aW9uIChJbmN1YmF0aW9uKQotCi0jICJmZWF0dXJlUHJvdmlkZXIiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1mZWF0dXJlUHJvdmlkZXI9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUpBWC1XUyBUb29scyBVc2VyIERvY3VtZW50YXRpb24KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuXG5cCi0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWVwbC12MTAuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjMjZlZi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmpheHdzX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIwLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlZmVhdHVyZVByb3ZpZGVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3NfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3c191c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGM1ZTMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwNDViNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMTVkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAwLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlswLjUuMCwwLjYuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlswLjEuMCwwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmOTBkOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwNDI0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI1Byb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cwotQnVuZGxlLU5hbWUuMCA9IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9BbGxUZXN0c1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1NDhkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMuSkFYQkNvcmVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzLkpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMuSkFYV1NDb3JlVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3BlY2lmaWVzIGFsbCB0aGUgYnVuZGxlcyBvZiB0aGlzIGNvbXBvbmVudCB0aGF0IHByb3ZpZGUgYSB0ZXN0Ci0gKiBzdWl0ZSB0byBydW4gZHVyaW5nIGF1dG9tYXRlZCB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVGVzdHNTdWl0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxUZXN0c1N1aXRlKCkgewotICAgICAgICBzdXBlcigiQWxsIEpBWFdTIGFuZCBKQVhCIFRlc3QgU3VpdGVzIik7Ci0gICAgICAgIGFkZFRlc3QoSkFYV1NDb3JlVGVzdFN1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoSkFYQkNvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0KLSAgICAgICAgLy9BZGRpbmcgSkFYLVdTIERPTSBUb29scyB0ZXN0IHN1aXRlcwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMuZG9tLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnRlc3RzLkFsbFRlc3RzU3VpdGUuc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5BbGxUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMganVzdCBuZWVkIHRvIHJ1biBpbiBhIGRldmVsb3BtZW50IGVudmlyb25tZW50IHdvcmtiZW5jaC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgewotICAgICAgICAvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBleGlzdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCi0gICAgICAgIC8vIG90aGVyIHRoYW4gdG8gc2lnbmFsIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgotICAgICAgICAvLyBUaGUgcmVzdCBpdCBhdXRvbWF0aWMgZnJvbSB0aGUgdGVzdHMgYWRkZWQgaW4gY29uc3RydWN0b3IuCi0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvY3hmL3Rlc3RzL0Vhc3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMmU3MDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2N4Zi90ZXN0cy9FYXN5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRWFzeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBzaW1wbGUgdGVzdCBqdXN0IHRvIGFsd2F5cyBzdWNjZWVkIHRvIGRlbW9uc3RyYXRlIHRlc3RzIGFyZSBiZWluZyBjYWxsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGhhdFRlc3RzUnVuKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuY3hmLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJhZmU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0Ci0gICAgbmFtZT0idGVzdHN1aXRlIgotICAgIGRlZmF1bHQ9InJ1biIKLSAgICBiYXNlZGlyPSIuIj4KLQotICAgIDwhLS0gCi0gICAgICAgICBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0Ci0gICAgICAgICBzbyB3ZSdsbCBmYWlsIGZhc3QgaWYgbm90LiAKLSAgICAgICAgICAgICAke2VjbGlwc2UtaG9tZX0gICAKLSAgICAgICAgICAgICAke2J1aWxkRGlyZWN0b3J5fQotICAgICAgICAgICAgICR7YnVpbGRMYWJlbH0gICAgICAgIAotICAgIC0tPgotICAKLSAgCTxmYWlsCi0gICAgICAgIG1lc3NhZ2U9IkVycm9yOiBtaXNzaW5nIHByb3BlcnR5LiBlY2xpcHNlLWhvbWUgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJlY2xpcHNlLWhvbWUiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkRGlyZWN0b3J5IG11c3QgYmUgcHJvdmlkZWQiCi0gICAgICAgIHVubGVzcz0iYnVpbGREaXJlY3RvcnkiIC8+Ci0gICAgPGZhaWwKLSAgICAgICAgbWVzc2FnZT0iRXJyb3I6IG1pc3NpbmcgcHJvcGVydHkuIGJ1aWxkTGFiZWwgbXVzdCBiZSBwcm92aWRlZCIKLSAgICAgICAgdW5sZXNzPSJidWlsZExhYmVsIiAvPgotCQotICAgIDwhLS0gc2hvdWxkIGJlIGxpdHRsZSBuZWVkIHRvIGNoYW5nZSB3aGF0J3MgYWJvdmUgIC0tPgotCQotICAgIDxwcm9wZXJ0eQotICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC53cy5jeGYudGVzdHMiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0iY2xhc3NuYW1lIgotICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LndzLmN4Zi50ZXN0cy5BbGxUZXN0c1N1aXRlIi8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9InRlc3RUeXBlIgotICAgICAgICB2YWx1ZT0idWktdGVzdCIvPgotCi0gICAgPCEtLSBzaG91bGQgYmUgbGl0dGxlIG5lZWQgdG8gY2hhbmdlIHdoYXQncyBiZWxvdyAtLT4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJiYXNlZGlyOiAke2Jhc2VkaXJ9Ii8+Ci0gICAgPGVjaG8KLSAgICAgICAgbWVzc2FnZT0iZWNsaXBzZS1ob21lOiAke2VjbGlwc2UtaG9tZX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJidWlsZERpcmVjdG9yeTogJHtidWlsZERpcmVjdG9yeX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJwbHVnaW4tbmFtZTogJHtwbHVnaW4tbmFtZX0iLz4KLSAgICA8ZWNobwotICAgICAgICBtZXNzYWdlPSJjbGFzc25hbWU6ICR7Y2xhc3NuYW1lfSIvPgotICAgIDxlY2hvCi0gICAgICAgIG1lc3NhZ2U9InRlc3RUeXBlICR7dGVzdFR5cGV9Ii8+Ci0gICAgPHByb3BlcnR5Ci0gICAgICAgIG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgICA8cHJvcGVydHkKLSAgICAgICAgbmFtZT0id29ya3NwYWNlIgotICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2p1bml0d29ya3NwYWNlcy8ke3BsdWdpbi1uYW1lfSIvPgotCSAgPGVjaG8gCi0JICAgICAgbWVzc2FnZT0id29ya3NwYWNlOiAke3dvcmtzcGFjZX0iIC8+Ci0gICAgPCEtLQotICAgICAgICBUaGlzIGluaXQgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZQotICAgICAgICBmb3IgYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwKLSAgICAgICAgdGVzdHMgc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIAotICAgIC0tPgotICAgIDx0YXJnZXQKLSAgICAgICAgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDx0c3RhbXAvPgotICAgICAgICA8ZGVsZXRlPgotICAgICAgICAgICAgPGZpbGVzZXQKLSAgICAgICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSIKLSAgICAgICAgICAgICAgICBpbmNsdWRlcz0iJHtwbHVnaW4tbmFtZX0uKnhtbCIvPgotICAgICAgICA8L2RlbGV0ZT4KLSAgICAgICAgPCEtLSBtYWtlIGRpcmVjdG9yeSwgaW4gY2FzZSBwYXRoIGRvZXNuJ3QgZXhpc3QgeWV0IC0tPgotICAgICAgICA8bWtkaXIKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICAgIDwhLS0gIGJ1dCBkZWxldGUgdG8gbWFrZSBzdXJlIGZyZXNoIGNvbnRlbnRzLS0+Ci0gICAgICAgIDxkZWxldGUKLSAgICAgICAgICAgIGRpcj0iJHt3b3Jrc3BhY2V9IgotICAgICAgICAgICAgcXVpZXQ9InRydWUiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJzdWl0ZSI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iJHt0ZXN0VHlwZX0iCi0gICAgICAgICAgICBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iCi0gICAgICAgICAgICBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJkYXRhLWRpciIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImNsYXNzbmFtZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtjbGFzc25hbWV9Ii8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJwbHVnaW4tcGF0aCIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgICAgPC9hbnQ+Ci0gICAgICAgIDxjb3B5Ci0gICAgICAgICAgICBmYWlsb25lcnJvcj0iZmFsc2UiCi0gICAgICAgICAgICBmaWxlPSIke3dvcmtzcGFjZX0vLm1ldGFkYXRhLy5sb2ciCi0gICAgICAgICAgICB0b2ZpbGU9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vdGVzdFJlc3VsdHMvY29uc29sZWxvZ3MvJHtwbHVnaW4tbmFtZX0uY29uc29sZWxvZy50eHQiLz4KLSAgICA8L3RhcmdldD4KLQotICAgIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICAgIDwhLS0KLSAgICAgICAgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0bwotICAgIC0tPgotICAgIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgICA8dGFyZ2V0Ci0gICAgICAgIG5hbWU9ImNsZWFudXAiPgotICAgICAgICA8IS0tCi0gICAgICAgICAgICB1c3VhbGx5IG5vIG5lZWQgdG8gZGVsZXRlIHdvcmtzcGFjZSB1bnRpbCBuZXh0IHJ1biwgYW5kCi0gICAgICAgICAgICBsZWF2aW5nIGl0IGFsbG93cyBpbnNwZWN0aW9uCi0gICAgICAgIC0tPgotICAgICAgICA8IS0tIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIiAvPiAtLT4KLSAgICA8L3RhcmdldD4KLSAgICA8IS0tCi0gICAgICAgIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4KLSAgICAtLT4KLSAgICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gICAgPHRhcmdldAotICAgICAgICBuYW1lPSJydW4iCi0gICAgICAgIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgICAgIDxhbnQKLSAgICAgICAgICAgIHRhcmdldD0iY29sbGVjdCIKLSAgICAgICAgICAgIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIKLSAgICAgICAgICAgIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgIG5hbWU9ImluY2x1ZGVzIgotICAgICAgICAgICAgICAgIHZhbHVlPSIke3BsdWdpbi1uYW1lfS4qeG1sIi8+Ci0gICAgICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgICBuYW1lPSJvdXRwdXQtZmlsZSIKLSAgICAgICAgICAgICAgICB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgICAgIDwvYW50PgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzMGNiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTRhZGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDAyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1RodSBNYXkgMDcgMTU6NDA6MjMgSVNUIDIwMDkKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmYjk2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZTtidW5kbGUtdmVyc2lvbj0iMC41LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsudWkucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnM7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIsCi0gamF2YXgueG1sLmJpbmQuYXR0YWNobWVudDt2ZXJzaW9uPSJbMi4xLjAsMi4yLjApIiwKLSBqYXZheC54bWwuYmluZC5oZWxwZXJzO3ZlcnNpb249IlsyLjEuMCwyLjIuMCkiLAotIGphdmF4LnhtbC5iaW5kLnV0aWw7dmVyc2lvbj0iWzIuMS4wLDIuMi4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNmEwMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDNiYzc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYTdlYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWEIgVG9vbHMgVGVzdHMKLXBsdWdpbk5hbWU9SkFYQiBUb29scyBUZXN0cyAoSW5jdWJhdGlvbikKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0ODE1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IHRlc3RKYXZhUHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2U7Ci0gICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIEFTVCBhc3Q7Ci0gICAgcHJvdGVjdGVkIEFTVFJld3JpdGUgcmV3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2U7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0ID0gbmV3IFRlc3RKYXZhUHJvamVjdCgiSmF2YVByb2plY3QiKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5lbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLQotICAgICAgICBzb3VyY2UgPSB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldENsYXNzTmFtZSgpLCBnZXRDbGFzc0NvbnRlbnRzKCkpOwotICAgICAgICAKLSAgICAgICAgY29tcGlsYXRpb25Vbml0ID0gU2hhcmVkQVNUUHJvdmlkZXIuZ2V0QVNUKHNvdXJjZSwgU2hhcmVkQVNUUHJvdmlkZXIuV0FJVF9ZRVMsIG51bGwpOwotICAgICAgICBhc3QgPSBjb21waWxhdGlvblVuaXQuZ2V0QVNUKCk7Ci0gICAgICAgIHJld3JpdGVyID0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0KTsKLSAgICAgICAgYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oKTsKLSAgICAgICAgdGV4dEZpbGVDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoIkFkZCBhbm5vdGF0aW9uIiwgKElGaWxlKSBzb3VyY2UuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgIE11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXV0b0J1aWxkaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCk7Ci0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotICAgIAotICAgIHByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhbmdlLmluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShtb25pdG9yKTsKLQotICAgICAgICBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uIGNoYW5nZU9wZXJhdGlvbiA9IG5ldyBQZXJmb3JtQ2hhbmdlT3BlcmF0aW9uKGNoYW5nZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNoYW5nZU9wZXJhdGlvbi5ydW4obW9uaXRvcik7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGNlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGFuZ2VPcGVyYXRpb24uY2hhbmdlRXhlY3V0ZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJZGVsZXRlUHJvamVjdCh0ZXN0SmF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLSAgICAJCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgCWludCBub0F0dGVtcHRzID0gMDsKLSAgICAJd2hpbGUgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpICYmIG5vQXR0ZW1wdHMgPCA1KSB7Ci0gICAgCQl0cnkgewotICAgIAkJCW5vQXR0ZW1wdHMrKzsKLSAgICAJCQlpZiAocHJvamVjdC5pc09wZW4oKSkgewotICAgIAkJCQlwcm9qZWN0LmNsb3NlKG51bGwpOyAgICAJCQkJCi0gICAgCQkJfQotICAgIAkJCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotICAgIAkJfSBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gcmUpIHsKLSAgICAJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAJCQlUaHJlYWQuc2xlZXAoMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvUGFja2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2ZDkxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFByb2dyZXNzIFNvZnR3YXJlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIEFkZEFubm90YXRpb25Ub1BhY2thZ2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlLWluZm8uamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICByZXR1cm4gInBhY2thZ2UgY29tLmV4YW1wbGU7XG4iOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGxvY2F0aW9uVlAgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAibG9jYXRpb24iLCAidXJpOnNvbWVTY2hlbWEiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZXNwYWNlVlAgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAibmFtZXNwYWNlIiwgInVyaTp0ZXN0TlMiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChsb2NhdGlvblZQKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZXNwYWNlVlApOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFhtbFNjaGVtYS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9QYWNrYWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhYbWxTY2hlbWEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgSVBhY2thZ2VEZWNsYXJhdGlvbiBteVBhY2thZ2UgPSBzb3VyY2UuZ2V0UGFja2FnZURlY2xhcmF0aW9uKGdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChteVBhY2thZ2UpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobXlQYWNrYWdlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChteVBhY2thZ2UsIFhtbFNjaGVtYS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobXlQYWNrYWdlLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9KQVhCQ29yZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VhMDExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvSkFYQkNvcmVUZXN0U3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgT2lzaW4gSHVybGV5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhCQ29yZVRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSkFYQkNvcmVUZXN0U3VpdGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEpBWEJDb3JlVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcigiSkFYQiBDb3JlIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShBZGRBbm5vdGF0aW9uVG9QYWNrYWdlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShSZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmNsYXNzKTsgICAgCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbVBhY2thZ2VUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYWQ3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21QYWNrYWdlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAicGFja2FnZS1pbmZvLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoIkBYbWxTY2hlbWFcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYTtcblxuIik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tUGFja2FnZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoWG1sU2NoZW1hLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIElQYWNrYWdlRGVjbGFyYXRpb24gbXlQYWNrYWdlID0gc291cmNlLmdldFBhY2thZ2VEZWNsYXJhdGlvbihnZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXlQYWNrYWdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KG15UGFja2FnZSwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQobXlQYWNrYWdlLCBYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChteVBhY2thZ2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc291cmNlLmdldEltcG9ydChYbWxTY2hlbWEuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4Yi9jb3JlL3Rlc3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY0ZmM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBQcm9ncmVzcyBTb2Z0d2FyZQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4Yi5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdFByb2plY3QgewotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgYWRkUHJvamVjdE5hdHVyZShnZXRQcm9qZWN0KCksIEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0gICAgICAgIGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIGNyZWF0ZU91dHB1dEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChqYXZhUHJvamVjdCwgZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWTUluc3RhbGwgIT0gbnVsbCAmJiBpc0phdmE2T3JHcmVhdGVySlJFKGRlZmF1bHRWTUluc3RhbGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWTUluc3RhbGxUeXBlW10gaW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLSAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSBpbnN0YWxsVHlwZSA6IGluc3RhbGxUeXBlcykgewotICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSBpbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0gICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotICAgICAgICAgICAgICAgIGlmIChpc0phdmE2T3JHcmVhdGVySlJFKHZtSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoaW5zdGFsbFR5cGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE2T3JHcmVhdGVySlJFKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG5hbWUsIGNvbnRlbnRzLCBmYWxzZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOyAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgc3JjRGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIik7Ci0gICAgICAgIG1rZGlycyhzcmNEaXIpOyAgICAKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0Rpci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBvdXRwdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJiaW4iKTsKLSAgICAgICAgbWtkaXJzKG91dHB1dERpcik7Ci0gICAgICAgIGdldEphdmFQcm9qZWN0KCkuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0RGlyLmdldEZ1bGxQYXRoKCksIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudENsYXNzcGF0aEVudHJpZXMsIDAsIG5ld0NsYXNzcGF0aEVudHJpZXMsIDAsIAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3Q2xhc3NwYXRoRW50cmllc1tjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gY2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cmllcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIGptZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheGIvY29yZS90ZXN0cy9UZXN0UHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjNiMTUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXhiL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUHJvZ3Jlc3MgU29mdHdhcmUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheGIuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdCB7Ci0gICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gdGVzdFByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcmV2aW91c05hdHVyZXMgPSBwcm9qZWN0RGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2aW91c05hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzTmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldmlvdXNOYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdOYXR1cmVzW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlOwotICAgICAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWtkaXJzKGZpbmFsIElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgCXRyeSB7Ci0JICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSAmJiBmb2xkZXIuZ2V0UGFyZW50KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMwY2I3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0M2ZjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MDAyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUaHUgTWF5IDA3IDE1OjQwOjIzIElTVCAyMDA5Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzODNhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDAuNS4xLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlO2J1bmRsZS12ZXJzaW9uPSIwLjUuMCIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmU7YnVuZGxlLXZlcnNpb249IjAuNS4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjMuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4Lmp3cywKLSBqYXZheC5qd3Muc29hcCwKLSBqYXZheC54bWwud3M7dmVyc2lvbj0iMi4xLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2YTAzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDE5LCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkM2JjNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ5OTcxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZSBhbmQgb3RoZXJzCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNwcm9wZXJ0aWVzIGZpbGUgZm9yIEpBWC1XUyBUb29scyBUZXN0cwotcGx1Z2luTmFtZT1KQVgtV1MgVG9vbHMgVGVzdHMgKEluY3ViYXRpb24pCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1YWQwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMuQWJzdHJhY3RBbm5vdGF0aW9uVGVzdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGlzQW5ub3RhdGlvblByb2Nlc3NpbmdFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNGZmNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdERvY3VtZW50QmFyZVZhbGlkYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0gICAgICAgIAotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5ET0NVTUVOVCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuTElURVJBTCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuQkFSRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlUGFpcnMpOwotCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgU3RyaW5nIG9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7XG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH0iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0T25ld2F5VmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRlMzA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5PbmV3YXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLQotICAgIHB1YmxpYyBhYnN0cmFjdCBJTWV0aG9kIGdldE1ldGhvZFRvVGVzdCgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZXdheVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kVG9UZXN0KCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KE9uZXdheS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWUyNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKFN0cmluZyBpbikgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYWU4YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJNeUNsYXNzXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFN0cmluZyBteVBhY2thZ2VQcml2YXRlTWV0aG9kKCkge1xuXHRcdHJldHVybiBcInBhY2thZ2UtcHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcml2YXRlIFN0cmluZyBteVByaXZhdGVNZXRob2QoKSB7XG5cdFx0cmV0dXJuIFwicHJpdmF0ZVwiO1xuXHR9XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwcm90ZWN0ZWQgU3RyaW5nIG15UHJvdGVjdGVkTWV0aG9kKCkge1xuXHRcdG15UHJpdmF0ZU1ldGhvZCgpO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdFx0cmV0dXJuIFwicHJvdGVjdGVkXCI7XG5cdH1cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgc3RhdGljIFN0cmluZyBteVN0YXRpY01ldGhvZCgpIHtcblx0XHRyZXR1cm4gXCJzdGF0aWNcIjtcblx0fVxuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0cHVibGljIGZpbmFsIFN0cmluZyBteUZpbmFsTWV0aG9kKCkge1xuXHRcdHJldHVybiBcImZpbmFsXCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViTWV0aG9kUmVzdHJpY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kVG9UZXNldCgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViNjE5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0Fic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlUHVibGljQWJzdHJhY3RGaW5hbFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBvcnROYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJwb3J0TmFtZSIsCi0gICAgICAgICAgICAgICAgIk15Q2xhc3NQb3J0Iik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHNlcnZpY2VOYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInNlcnZpY2VOYW1lIiwgIk15Q2xhc3NTZXJ2aWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwb3J0TmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHNlcnZpY2VOYW1lVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QVUJMSUNfQUJTVFJBQ1RfRklOQUwsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTBkOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9BYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoZ2V0UGFja2FnZU5hbWUoKSwgZ2V0SW50ZXJmYWNlTmFtZSgpLCBnZXRJbnRlcmZhY2VDb250ZW50cygpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShlbmRwb2ludEludGVyZmFjZT1cImNvbS5leGFtcGxlLk15SW50ZXJmYWNlXCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgidGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2V4YW1wbGUuY29tL1wiLCBwb3J0TmFtZT1cIk15Q2xhc3NQb3J0XCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgic2VydmljZU5hbWU9XCJNeUNsYXNzU2VydmljZVwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgdm9pZCBtZXRob2RPbmUoU3RyaW5nIGluKSB7XG5cdH1cblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEludGVyZmFjZUNvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHNlaUNvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIHNlaUNvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15SW50ZXJmYWNlXCIsIHRhcmdldE5hbWVzcGFjZT1cImh0dHA6Ly9leGFtcGxlLmNvbS9cIilcbiIpOwotICAgICAgICBzZWlDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG4iKTsKLSAgICAgICAgc2VpQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIGluKTtcblxufSIpOwotICAgICAgICByZXR1cm4gc2VpQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEludGVyZmFjZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlJbnRlcmZhY2UuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVOb25Wb2lkTm9PdXRQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmY2NDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU5vblZvaWROb091dFBhcmFtZXRlcnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudEJhcmVWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBTdHJpbmcgbm9PdXQoU3RyaW5nIGluLCBAV2ViUGFyYW0obmFtZT1cIm91dFwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlN0cmluZyBvdXQpIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE5vblZvaWROb09VVFBhcmFtZXRlclJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJub091dCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyAifSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9OT05fVk9JRF9SRVRVUk5fTk9fSU5PVVRfT1VUX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZU9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViODQ1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0RvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEb2NCYXJlT25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHQiKTsKLSAgICAgICAgLy9jbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVJTigpIHtcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIFN0cmluZyBvbmVNb3JlKEBXZWJQYXJhbShuYW1lPVwiaW5PbmVcIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKSBTdHJpbmcgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbk9uZSwgQFdlYlBhcmFtKG5hbWU9XCJpblR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU4pU3RyaW5nIGluVHdvKSB7XG5cdFx0Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG5cdHB1YmxpYyBTdHJpbmcgb25seU9uZUlOKFN0cmluZyBpbk9uZSwgU3RyaW5nIGluVHdvKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHZvaWQgdGVzdE9uZU5vbkhlYWRlcklOUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlNPQVBCaW5kaW5nIiwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJvbmVJTiIsIG5ldyBTdHJpbmdbMF0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuZ2V0SW1wb3J0Q2hhbmdlKGNvbXBpbGF0aW9uVW5pdCwgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLCB0cnVlKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLmNyZWF0ZU1ldGhvZEFubm90YXRpb25DaGFuZ2Uoc291cmNlLCBjb21waWxhdGlvblVuaXQsIHJld3JpdGVyLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sIHRleHRGaWxlQ2hhbmdlKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSX0VSUk9SX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5T25lTm9uSGVhZGVySU5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25seU9uZUlOIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7IiB9KTsKLQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkRPQ19CQVJFX09OTFlfT05FX05PTl9IRUFERVJfSU5fUEFSQU1FVEVSLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9ubHlPbmVOb25IZWFkZXJJTlBhcmFtZXRlcldpdGhXZWJQYXJhbXNSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lTW9yZSIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIsCi0gICAgICAgICAgICAgICAgICAgICJRU3RyaW5nOyIgfSk7Ci0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5ET0NfQkFSRV9PTkxZX09ORV9OT05fSEVBREVSX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvRG9jQmFyZVZvaWRPbmVJTk9uZU91dFBhcmFtZXRlclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NjUxMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9Eb2NCYXJlVm9pZE9uZUlOT25lT3V0UGFyYW1ldGVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRCYXJlVmFsaWRhdGlvblRlc3QgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIHZvaWQgb25lSW4oQFdlYlBhcmFtKG5hbWU9XCJpbk9uZVwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gaW5PbmUsIEBXZWJQYXJhbShuYW1lPVwiaW5Ud29cIiwgbW9kZT1XZWJQYXJhbS5Nb2RlLklOKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlN0cmluZyBpblR3bykge1xuXG5cdH1cblxuXHQiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyB2b2lkIG9uZU91dChAV2ViUGFyYW0obmFtZT1cIm91dE9uZVwiLCBtb2RlPVdlYlBhcmFtLk1vZGUuSU5PVVQpICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiSG9sZGVyPFN0cmluZz4gb3V0T25lLCBAV2ViUGFyYW0obmFtZT1cIm91dFR3b1wiLCBtb2RlPVdlYlBhcmFtLk1vZGUuT1VUKSAiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IG91dFR3bykge1xuXG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkT25lSW5QYXJhbWV0ZXJSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgib25lSW4iLCBuZXcgU3RyaW5nW10geyAiUUhvbGRlcjxRU3RyaW5nOz47IiwKLSAgICAgICAgICAgICAgICAgICAgIlFTdHJpbmc7In0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX0lOX1BBUkFNRVRFUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkT25lT3V0UGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm9uZU91dCIsIG5ldyBTdHJpbmdbXSB7ICJRSG9sZGVyPFFTdHJpbmc7PjsiLAotICAgICAgICAgICAgICAgICAgICAiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuRE9DX0JBUkVfVk9JRF9SRVRVUk5fT05FX09VVF9QQVJBTUVURVIsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0hvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjdkNTE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSG9sZGVyVHlwZVBhcmFtZXRlclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5Ib2xkZXI7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKCIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlBhcmFtKG1vZGU9V2ViUGFyYW0uTW9kZS5JTikgSG9sZGVyPGphdmEubGFuZy5TdHJpbmc+IHBhcmFtKSB7XG5cblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RIb2xkZXJUeXBlUGFyYW1ldGVyUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLkhPTERFUl9UWVBFX01VU1RfQkVfT1VUX0lOT1VULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL0pBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg0YTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvSkFYV1NBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhXU0Fubm90YXRpb25WYWxpZGF0aW9uVGVzdFN1aXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEpBWFdTQW5ub3RhdGlvblZhbGlkYXRpb25UZXN0U3VpdGUoKSB7Ci0gICAgICAgIHN1cGVyKCJKQVgtV1MgQW5ub3RhdGlvbiBWYWxpZGF0aW9uIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShEb2NCYXJlTm9uVm9pZE5vT3V0UGFyYW1ldGVyc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVPbmVOb25IZWFkZXJJTlBhcmFtZXRlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKERvY0JhcmVWb2lkT25lSU5PbmVPdXRQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoT25ld2F5Tm9DaGVja2VkRXhjZXB0aW9uc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEhvbGRlclR5cGVQYXJhbWV0ZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShPbmV3YXlOb0hvbGRlclBhcmFtZXRlcnNSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ1N0eWxlT25NZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFNPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0ZpbmFsTW9kaWZlclJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VOb0Fic3RyYWN0TW9kaWZpZXJSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb0VuZHBvaW50SW50ZXJmYWNlUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShXZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFdlYlNlcnZpY2VTRUlOb1NPQVBCaW5kaW5nUnVsZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoV2ViU2VydmljZVdlYlNlcnZpY2VQcm92aWRlckNvRXhpc3RSdWxlVGVzdC5jbGFzcyk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5ZDA5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vQ2hlY2tlZEV4Y2VwdGlvbnNSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmV3YXlOb0NoZWNrZWRFeGNlcHRpb25zUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE9uZXdheVZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyB2b2lkIG15TWV0aG9kKGludCBpKSB0aHJvd3MgRXhjZXB0aW9uIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuT05FV0FZX05PX0NIRUNLRURfRVhDRVBUSU9OUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiSSJ9KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9Ib2xkZXJQYXJhbWV0ZXJzUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmNGE4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL09uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE9uZXdheU5vSG9sZGVyUGFyYW1ldGVyc1J1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuSG9sZGVyO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBteU1ldGhvZCgiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkhvbGRlcjxTdHJpbmc+IGluKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19IT0xERVJfUEFSQU1FVEVSUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc3QoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXXsiUUhvbGRlcjxRU3RyaW5nOz47In0pOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTBmOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9PbmV3YXlOb1JldHVyblZhbHVlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgT25ld2F5Tm9SZXR1cm5WYWx1ZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RPbmV3YXlWYWxpZGF0aW9uVGVzdCB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0JICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLQkgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgaW50IG15TWV0aG9kKGludCBpKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLQl9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLk9ORVdBWV9OT19SRVRVUk5fVkFMVUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXN0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW117IkkifSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVmODQyMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ0RvY3VtZW50RW5jb2RlZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuRE9DVU1FTlQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkVOQ09ERUQpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLkJBUkUpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nRG9jdW1lbnRFbmNvZGVkUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19ET0NVTUVOVF9FTkNPREVEX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nTWl4ZWRCaW5kaW5nc1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTAwY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmc7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuUGFyYW1ldGVyU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuU3R5bGU7Ci1pbXBvcnQgamF2YXguandzLnNvYXAuU09BUEJpbmRpbmcuVXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ01peGVkQmluZGluZ3NSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLkRPQ1VNRU5UKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBTT0FQQmluZGluZyhzdHlsZT1TT0FQQmluZGluZy5TdHlsZS5SUEMsIHVzZT1TT0FQQmluZGluZy5Vc2UuTElURVJBTCwgIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwYXJhbWV0ZXJTdHlsZT1TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZS5XUkFQUEVEKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZChTdHJpbmcgaW4pIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBcInR4dFwiO1xuXHR9XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdNaXhlZEJpbmRpbmdzUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5TT0FQQklORElOR19OT19NSVhFRF9CSU5ESU5HUywKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSQ1BCYXJlUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MjY5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFNPQVBCaW5kaW5nUkNQQmFyZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RTT0FQQmluZGluZ1ZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInN0eWxlIiwgU3R5bGUuUlBDKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdXNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInVzZSIsIFVzZS5MSVRFUkFMKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAicGFyYW1ldGVyU3R5bGUiLCBQYXJhbWV0ZXJTdHlsZS5CQVJFKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzdHlsZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHVzZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTT0FQQmluZGluZ1JQQ0JhcmVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuU09BUEJJTkRJTkdfUlBDX05PX0JBUkVfUEFSQU1FVEVSX1NUWUxFLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDRW5jb2RlZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYjBhMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9TT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZzsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5QYXJhbWV0ZXJTdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5TdHlsZTsKLWltcG9ydCBqYXZheC5qd3Muc29hcC5TT0FQQmluZGluZy5Vc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBTT0FQQmluZGluZ1JQQ0VuY29kZWRSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0U09BUEJpbmRpbmdWYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJzdHlsZSIsIFN0eWxlLlJQQyk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHVzZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJ1c2UiLCBVc2UuRU5DT0RFRCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHBhcmFtZXRlclN0eWxlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZUVudW1NZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgInBhcmFtZXRlclN0eWxlIiwgUGFyYW1ldGVyU3R5bGUuV1JBUFBFRCk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc3R5bGVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh1c2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U09BUEJpbmRpbmdSUENFbmNvZGVkUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX1JQQ19FTkNPREVEX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0MjRhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1NPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlBhcmFtZXRlclN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlN0eWxlOwotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nLlVzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU09BUEJpbmRpbmdSUENTdHlsZU9uTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNPQVBCaW5kaW5nVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc3R5bGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAic3R5bGUiLCBTdHlsZS5SUEMpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB1c2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgU09BUEJpbmRpbmcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAidXNlIiwgVXNlLkxJVEVSQUwpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJhbWV0ZXJTdHlsZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVFbnVtTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJwYXJhbWV0ZXJTdHlsZSIsIFBhcmFtZXRlclN0eWxlLldSQVBQRUQpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHN0eWxlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodXNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocGFyYW1ldGVyU3R5bGVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNPQVBCaW5kaW5nUlBDU3R5bGVPbk1ldGhvZHNSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhTT0FQQmluZGluZy5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFNPQVBCaW5kaW5nLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLlNPQVBCSU5ESU5HX05PX1JQQ19TVFlMRV9PTl9NRVRIT0RTLAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDBjNGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RDaGVja0ZvcldlYlNlcnZpY2VSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAibXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJhY3Rpb24iLAotICAgICAgICAgICAgICAgICJ1cm46TXlNZXRob2QiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChvcGVyYXRpb25WYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChhY3Rpb25WYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX1NVUFBPUlRFRF9PTl9DTEFTU0VTX1dJVEhfV0VCU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU4OGJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kRXhjbHVkZVJ1bGVPbkltcGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAibXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgYWN0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJhY3Rpb24iLAotICAgICAgICAgICAgICAgICJ1cm46TXlNZXRob2QiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZXhjbHVkZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgImV4Y2x1ZGUiLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoYWN0aW9uVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZXhjbHVkZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZENoZWNrRm9yV2ViU2VydmljZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX1NQRUNJRklFRF9OT19PVEhFUl9BVFRSSUJVVEVTX0FMTE9XRUQsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODAyNDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2RFeGNsdWRlUnVsZU9uU0VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25TRUlUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgZXhjbHVkZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVCb29sZWFuTWVtYmVyVmFsdWVQYWlyKGFzdCwgImV4Y2x1ZGUiLAotICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoZXhjbHVkZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbWVtYmVyVmFsdWVQYWlycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15SW50ZXJmYWNlXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlDbGFzcyB7XG5cblx0cHVibGljIFN0cmluZyBteU1ldGhvZCgpO1xufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYk1ldGhvZEV4Y2x1ZGVSdWxlT25JbnRlcmZhY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9FWENMVURFX05PVF9BTExPV0VEX09OX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb0ZpbmFsTW9kaWZpZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRkNTZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9GaW5hbE1vZGlmaWVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYk1ldGhvZFB1YmxpY1N0YXRpY0ZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNZXRob2QgZ2V0TWV0aG9kVG9UZXNldCgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15RmluYWxNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9OT19GSU5BTF9NT0RJRklFUl9BTExPV0VEOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZThlYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1BhY2thZ2VQcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9QYWNrYWdlUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVBhY2thZ2VQcml2YXRlTWV0aG9kIiwgbmV3IFN0cmluZ1swXSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0gICAgICAgIHJldHVybiBKQVhXU0NvcmVNZXNzYWdlcy5XRUJNRVRIT0RfT05MWV9PTl9QVUJMSUNfTUVUSE9EUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9Qcml2YXRlTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyNDFjMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYk1ldGhvZE5vUHJpdmF0ZU1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVByaXZhdGVNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1Byb3RlY3RlZE1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ODM1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYk1ldGhvZE5vUHJvdGVjdGVkTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9Qcm90ZWN0ZWRNZXRob2RSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViTWV0aG9kUHVibGljU3RhdGljRmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1ldGhvZCBnZXRNZXRob2RUb1Rlc2V0KCkgewotICAgICAgICByZXR1cm4gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlQcm90ZWN0ZWRNZXRob2QiLCBuZXcgU3RyaW5nWzBdKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLSAgICAgICAgcmV0dXJuIEpBWFdTQ29yZU1lc3NhZ2VzLldFQk1FVEhPRF9PTkxZX09OX1BVQkxJQ19NRVRIT0RTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYWU1M2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJNZXRob2ROb1N0YXRpY01vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViTWV0aG9kTm9TdGF0aWNNb2RpZmllclJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJNZXRob2RQdWJsaWNTdGF0aWNGaW5hbFJ1bGVUZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTWV0aG9kIGdldE1ldGhvZFRvVGVzZXQoKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteVN0YXRpY01ldGhvZCIsIG5ldyBTdHJpbmdbMF0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotICAgICAgICByZXR1cm4gSkFYV1NDb3JlTWVzc2FnZXMuV0VCTUVUSE9EX05PX1NUQVRJQ19NT0RJRklFUl9BTExPV0VEOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViUGFyYW1Nb2RlSG9sZGVyVHlwZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MjNmMDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW0uTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTG9jYWxWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlBhcmFtTW9kZUhvbGRlclR5cGVSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblZhbGlkYXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1vZGVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlRW51bU1lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLCAibW9kZSIsIE1vZGUuT1VUKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChtb2RlVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiQFdlYlNlcnZpY2UobmFtZT1cIk15Q2xhc3NcIilcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoU3RyaW5nIHBhcmFtKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJQYXJhbU1vZGVIb2xkZXJUeXBlUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgInBhcmFtIik7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCUEFSQU1fTU9ERV9PVVRfSU5PVVRfSE9MREVSX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Y2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VEZWZhdWx0UHVibGljQ29uc3RydWN0b3JSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE4ZmRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZURlZmF1bHRQdWJsaWNDb25zdHJ1Y3RvclJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgTXlDbGFzcyhTdHJpbmcgYXJnKSB7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlRGVmYXVsdFB1YmxpY0NvbnN0cnVjdG9yUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9ERUZBVUxUX1BVQkxJQ19DT05TVFJVQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vQWJzdHJhY3RNb2RpZmllclJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDgzMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9BYnN0cmFjdE1vZGlmaWVyUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VQdWJsaWNBYnN0cmFjdEZpbmFsUnVsZVRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmM5MWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZU5vRmluYWxNb2RpZmVyUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlTm9GaW5hbE1vZGlmZXJSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVB1YmxpY0Fic3RyYWN0RmluYWxSdWxlVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBmaW5hbCBjbGFzcyBNeUNsYXNzIHtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlNZXRob2QoKSB7IiArICJcblx0XHRyZXR1cm4gXCJ0eHRcIjtcblx0fVxuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlTm9GaW5hbGl6ZU1ldGhvZFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0YzQzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25WYWxpZGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsICJuYW1lIiwgIk15Q2xhc3MiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiTXlDbGFzc1NlcnZpY2UiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgdGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgInRhcmdldE5hbWVzcGFjZSIsICJodHRwOi8vZXhhbXBsZS5jb20vIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHBvcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQoc2VydmljZU5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIHtcblxuXHRwdWJsaWMgdm9pZCBmaW5hbGl6ZSgpIHtcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VOb0ZpbmFsaXplTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfT1ZFUlJJREVfRklOQUxJWkUsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vRW5kcG9pbnRJbnRlcmZhY2VSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMGRlMWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIGVuZHBvaW50SW50ZXJmYWNlVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgImVuZHBvaW50SW50ZXJmYWNlIiwgIk15SW50ZXJmYWNlIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChlbmRwb2ludEludGVyZmFjZVZhbHVlUGFpcik7Ci0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cblx0cHVibGljIFN0cmluZyBteWVNZXRob2QoKTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9FbmRwb2ludEludGVyZmFjZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VORFBPSU5USU5URVJGQUNFX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9PbmV3YXlSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGM3ZjM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vT25ld2F5UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuT25ld2F5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb09uZXdheVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBPbmV3YXkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb09uZXdheVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE9uZXdheS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibWV0aG9kT25lIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBPbmV3YXkuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoT25ld2F5LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotCi0gICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKLQotICAgICAgICAgICAgSU1hcmtlcltdIGFsbG1hcmtlcnMgPSBzb3VyY2UuZ2V0UmVzb3VyY2UoKS5maW5kTWFya2VycyhJTWFya2VyLlBST0JMRU0sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhbGxtYXJrZXJzLmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXIgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIgPSBhbGxtYXJrZXJzWzBdOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoc291cmNlLmdldFJlc291cmNlKCksIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldFJlc291cmNlKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEpBWFdTQ29yZU1lc3NhZ2VzLldFQlNFUlZJQ0VfRU5QT0lOVElOVEVSRkFDRV9OT19PTkVXQVksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOWYwNDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9Qb3J0TmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBwb3J0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicG9ydE5hbWUiLAotICAgICAgICAiTXlDbGFzc1BvcnQiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotCi0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBpbnRlcmZhY2UgTXlJbnRlcmZhY2Uge1xuXG5cdHB1YmxpYyBTdHJpbmcgbXllTWV0aG9kKCk7XG5cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUludGVyZmFjZS5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSU5vUG9ydE5hbWVSdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9QT1JUTkFNRV9TRUksCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDFiOTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TT0FQQmluZGluZ1J1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5zb2FwLlNPQVBCaW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vU09BUEJpbmRpbmdSdWxlVGVzdCBleHRlbmRzIEFic3RyYWN0V2ViU2VydmljZVNFSVJ1bGUgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TT0FQQmluZGluZ09uTWV0aG9kUnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoU09BUEJpbmRpbmcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoIm15TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TT0FQQmluZGluZ09uVHlwZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNPQVBCaW5kaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBTT0FQQmluZGluZy5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fU09BUEJJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vU2VydmljZU5hbWVSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzM1ZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJNeUNsYXNzIik7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIHRhcmdldE5hbWVzcGFjZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciBzZXJ2aWNlTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LAotICAgICAgICAgICAgICAgICJzZXJ2aWNlTmFtZSIsICJNeUNsYXNzU2VydmljZSIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZCh0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7XG5cblx0cHVibGljIFN0cmluZyBteWVNZXRob2QoKTtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15SW50ZXJmYWNlLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJTm9TZXJ2aWNlTmFtZVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoc291cmNlLCBBbm5vdGF0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX1NFUlZJQ0VOQU1FX1NFSSwKLSAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIG9jZSkgewotICAgICAgICAgICAgZmFpbChvY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgIGZhaWwoaWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJNZXRob2RSdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQ5MjA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViTWV0aG9kUnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYk1ldGhvZFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RXZWJTZXJ2aWNlU0VJUnVsZSB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViU2VydmljZVNFSVByZXNlbnROb1dlYk1ldGhvZFJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYk1ldGhvZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgibXlNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9FTlBPSU5USU5URVJGQUNFX05PX1dFQk1FVEhPRFMsCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS9hbm5vdGF0aW9uL3ZhbGlkYXRpb24vdGVzdHMvV2ViU2VydmljZVNFSU5vV2ViUGFyYW1SdWxlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Yjk0YzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJQYXJhbVJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUuYW5ub3RhdGlvbi52YWxpZGF0aW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuamF4d3MuY29yZS5KQVhXU0NvcmVNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VTRUlOb1dlYlBhcmFtUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VTRUlQcmVzZW50Tm9XZWJQYXJhbVJ1bGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJtZXRob2RPbmUiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaW4iKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQobG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUEFSQU0sCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VTRUlOb1dlYlJlc3VsdFJ1bGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGYyOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlU0VJTm9XZWJSZXN1bHRSdWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLmFubm90YXRpb24udmFsaWRhdGlvbi50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5qYXh3cy5jb3JlLkpBWFdTQ29yZU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZVNFSU5vV2ViUmVzdWx0UnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFdlYlNlcnZpY2VTRUlSdWxlIHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlJlc3VsdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJTZXJ2aWNlU0VJUHJlc2VudE5vV2ViUmVzdWx0UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViUmVzdWx0LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJteU1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ICJRU3RyaW5nOyIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KG1ldGhvZCwgV2ViUmVzdWx0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRBbm5vdGF0aW9uVGV4dEVkaXQobWV0aG9kLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlJlc3VsdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLQotICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0KLSAgICAgICAgICAgIElNYXJrZXJbXSBhbGxtYXJrZXJzID0gc291cmNlLmdldFJlc291cmNlKCkuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWxsbWFya2Vycy5sZW5ndGgpOwotCi0gICAgICAgICAgICBJTWFya2VyIGFubm90YXRpb25Qcm9ibGVtTWFya2VyID0gYWxsbWFya2Vyc1swXTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZS5nZXRSZXNvdXJjZSgpLCBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhKQVhXU0NvcmVNZXNzYWdlcy5XRUJTRVJWSUNFX0VOUE9JTlRJTlRFUkZBQ0VfTk9fV0VCUkVTVUxULAotICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gb2NlKSB7Ci0gICAgICAgICAgICBmYWlsKG9jZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotICAgICAgICAgICAgZmFpbChpZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL2Fubm90YXRpb24vdmFsaWRhdGlvbi90ZXN0cy9XZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZDM0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvYW5ub3RhdGlvbi92YWxpZGF0aW9uL3Rlc3RzL1dlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS5hbm5vdGF0aW9uLnZhbGlkYXRpb24udGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmpheHdzLmNvcmUuSkFYV1NDb3JlTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlV2ViU2VydmljZVByb3ZpZGVyQ29FeGlzdFJ1bGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVmFsaWRhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLlByb3ZpZGVyO1xuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VQcm92aWRlcjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZVByb3ZpZGVyXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBNeUNsYXNzIGltcGxlbWVudHMgUHJvdmlkZXI8U291cmNlPiB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU291cmNlIGludm9rZShTb3VyY2UgYXJnMCkgeyIgKyAiXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdlYlNlcnZpY2VXZWJTZXJ2aWNlUHJvdmlkZXJDb0V4aXN0UnVsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0KLSAgICAgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCi0gICAgICAgICAgICBJTWFya2VyW10gYWxsbWFya2VycyA9IHNvdXJjZS5nZXRSZXNvdXJjZSgpLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFsbG1hcmtlcnMubGVuZ3RoKTsKLQotICAgICAgICAgICAgSU1hcmtlciBhbm5vdGF0aW9uUHJvYmxlbU1hcmtlciA9IGFsbG1hcmtlcnNbMF07Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UuZ2V0UmVzb3VyY2UoKSwgYW5ub3RhdGlvblByb2JsZW1NYXJrZXIuZ2V0UmVzb3VyY2UoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSkFYV1NDb3JlTWVzc2FnZXMuV0VCU0VSVklDRV9XRUJTRVJWSUNFUFJPVklERVJfQ09NQklOQVRJT04sCi0gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Qcm9ibGVtTWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBvY2UpIHsKLSAgICAgICAgICAgIGZhaWwob2NlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0gICAgICAgICAgICBmYWlsKGllLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWJzdHJhY3RBbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZiMzc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BYnN0cmFjdEFubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuU2hhcmVkQVNUUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlBlcmZvcm1DaGFuZ2VPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICBwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IHRlc3RKYXZhUHJvamVjdDsKLSAgICBwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBzb3VyY2U7Ci0gICAgcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQ7Ci0gICAgcHJvdGVjdGVkIEFTVCBhc3Q7Ci0gICAgcHJvdGVjdGVkIEFTVFJld3JpdGUgcmV3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbjsKLSAgICBwcm90ZWN0ZWQgVGV4dEZpbGVDaGFuZ2UgdGV4dEZpbGVDaGFuZ2U7Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0ID0gbmV3IFRlc3RKYXZhUHJvamVjdCgiSmF2YVByb2plY3QiKTsKLSAgICAgICAgdGVzdEphdmFQcm9qZWN0LnNldEF1dG9CdWlsZGluZyhpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSk7Ci0gICAgICAgIHRlc3RKYXZhUHJvamVjdC5lbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpKTsKLQotICAgICAgICBzb3VyY2UgPSB0ZXN0SmF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGdldFBhY2thZ2VOYW1lKCksIGdldENsYXNzTmFtZSgpLCBnZXRDbGFzc0NvbnRlbnRzKCkpOwotCi0gICAgICAgIGNvbXBpbGF0aW9uVW5pdCA9IFNoYXJlZEFTVFByb3ZpZGVyLmdldEFTVChzb3VyY2UsIFNoYXJlZEFTVFByb3ZpZGVyLldBSVRfWUVTLCBudWxsKTsKLSAgICAgICAgYXN0ID0gY29tcGlsYXRpb25Vbml0LmdldEFTVCgpOwotICAgICAgICByZXdyaXRlciA9IEFTVFJld3JpdGUuY3JlYXRlKGFzdCk7Ci0gICAgICAgIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0gICAgICAgIHRleHRGaWxlQ2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKCJBZGQgYW5ub3RhdGlvbiIsIChJRmlsZSkgc291cmNlLmdldFJlc291cmNlKCkpOwotICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotICAgICAgICB0ZXh0RmlsZUNoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0F1dG9CdWlsZGluZ0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fubm90YXRpb25Qcm9jZXNzaW5nRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENsYXNzTmFtZSgpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpOwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYW5nZS5pbml0aWFsaXplVmFsaWRhdGlvbkRhdGEobW9uaXRvcik7Ci0KLSAgICAgICAgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbiBjaGFuZ2VPcGVyYXRpb24gPSBuZXcgUGVyZm9ybUNoYW5nZU9wZXJhdGlvbihjaGFuZ2UpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFuZ2VPcGVyYXRpb24ucnVuKG1vbml0b3IpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBjZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hhbmdlT3BlcmF0aW9uLmNoYW5nZUV4ZWN1dGVkKCk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWRlbGV0ZVByb2plY3QodGVzdEphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAJaW50IG5vQXR0ZW1wdHMgPSAwOwotICAgIAl3aGlsZSAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkgJiYgbm9BdHRlbXB0cyA8IDUpIHsKLSAgICAJCXRyeSB7Ci0gICAgCQkJbm9BdHRlbXB0cysrOwotICAgIAkJCWlmIChwcm9qZWN0LmlzT3BlbigpKSB7Ci0gICAgCQkJCXByb2plY3QuY2xvc2UobnVsbCk7ICAgIAkJCQkKLSAgICAJCQl9Ci0gICAgCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0gICAgCQl9IGNhdGNoIChSZXNvdXJjZUV4Y2VwdGlvbiByZSkgewotICAgIAkJCVN5c3RlbS5vdXQucHJpbnRsbihyZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgIAkJCVRocmVhZC5zbGVlcCgxKTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9GaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjNjkyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJNeUNsYXNzLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgcmV0dXJuICJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG5wdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cblx0c3RhdGljIFN0cmluZyBzZXJ2aWNlO1xuXG59IjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICBMaXN0PE1lbWJlclZhbHVlUGFpcj4gbWVtYmVyVmFsdWVQYWlycyA9IG5ldyBBcnJheUxpc3Q8TWVtYmVyVmFsdWVQYWlyPigpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB3c2RsTG9jYXRpb25WYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAid3NkbExvY2F0aW9uIiwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4My9TZXJ2aWNlUHJvamVjdC9zZXJ2aXZlcy9NeVNlcnZpY2U/V1NETCIpOwotCi0gICAgICAgIG1lbWJlclZhbHVlUGFpcnMuYWRkKHdzZGxMb2NhdGlvblZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9GaWVsZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgic2VydmljZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEltcG9ydFRleHRFZGl0KGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KGZpZWxkLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTIyOTViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9NZXRob2RQYXJhbWV0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAibmFtZSIsICJpIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQobmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvTWV0aG9kUGFyYW1ldGVyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJQYXJhbS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldE1ldGhvZCgiYWRkIiwgbmV3IFN0cmluZ1tdIHsgIkkiLCAiSSIgfSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0KLSAgICAgICAgICAgIElMb2NhbFZhcmlhYmxlIGxvY2FsVmFyaWFibGUgID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmU2MWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9NZXRob2RUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICByZXR1cm4gImNvbS5leGFtcGxlIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IG1lbWJlclZhbHVlUGFpcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlclZhbHVlUGFpcj4oKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uVmFsdWVQYWlyID0gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ01lbWJlclZhbHVlUGFpcihhc3QsCi0gICAgICAgICAgICAgICAgIm9wZXJhdGlvbk5hbWUiLCAiYWRkIik7Ci0KLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQob3BlcmF0aW9uVmFsdWVQYWlyKTsKLQotICAgICAgICByZXR1cm4gQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZU5vcm1hbEFubm90YXRpb24oYXN0LCBXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBtZW1iZXJWYWx1ZVBhaXJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQW5ub3RhdGlvblRvTWV0aG9kKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVBZGRJbXBvcnRUZXh0RWRpdChtZXRob2QsIFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZUFkZEFubm90YXRpb25UZXh0RWRpdChtZXRob2QsIGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobWV0aG9kLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc291cmNlLmdldEltcG9ydChXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRBbm5vdGF0aW9uVG9UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGZhZDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL0FkZEFubm90YXRpb25Ub1R5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudXRpbHMuSkRUVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRBbm5vdGF0aW9uVG9UeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRwdWJsaWMgaW50IGFkZChpbnQgaSwgaW50IGspIHsiKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiBtZW1iZXJWYWx1ZVBhaXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXJWYWx1ZVBhaXI+KCk7Ci0KLSAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUKLSAgICAgICAgICAgICAgICAuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiQ2FsY3VsYXRvciIpOwotCi0gICAgICAgIE1lbWJlclZhbHVlUGFpciB0YXJnZXROYW1lc3BhY2VWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAidGFyZ2V0TmFtZXNwYWNlIiwgSkRUVXRpbHMuZ2V0VGFyZ2V0TmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKGdldFBhY2thZ2VOYW1lKCkpKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcG9ydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgInBvcnROYW1lIiwKLSAgICAgICAgICAgICAgICAiQ2FsY3VsYXRvclBvcnQiKTsKLQotICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgc2VydmljZU5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwKLSAgICAgICAgICAgICAgICAic2VydmljZU5hbWUiLCAiQ2FsY3VsYXRvclNlcnZpY2UiKTsKLQotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChuYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQodGFyZ2V0TmFtZXNwYWNlVmFsdWVQYWlyKTsKLSAgICAgICAgbWVtYmVyVmFsdWVQYWlycy5hZGQocG9ydE5hbWVWYWx1ZVBhaXIpOwotICAgICAgICBtZW1iZXJWYWx1ZVBhaXJzLmFkZChzZXJ2aWNlTmFtZVZhbHVlUGFpcik7Ci0KLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG1lbWJlclZhbHVlUGFpcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uVG9UeXBlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkSW1wb3J0VGV4dEVkaXQoc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLCBXZWJTZXJ2aWNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlQWRkQW5ub3RhdGlvblRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVDaGFuZ2UobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdGV4dEZpbGVDaGFuZ2UpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZmNTE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9BZGRNZW1iZXJWYWx1ZVBhaXJUb0Fubm90YXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsNCi0NCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsNCi1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsNCi0NCi1wdWJsaWMgY2xhc3MgQWRkTWVtYmVyVmFsdWVQYWlyVG9Bbm5vdGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3Qgew0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsNCi0JICAgIHJldHVybiBudWxsOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7DQotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7XG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXguandzLldlYlBhcmFtO1xuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4LnhtbC53cy5XZWJTZXJ2aWNlUmVmO1xuXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZSgpXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYlNlcnZpY2VSZWYoKVxuIik7DQotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15RmllbGQ7XG5cbiIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlx0QFdlYk1ldGhvZCgpXG4iKTsNCi0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbSgpIGludCBpLCBpbnQgaykgeyIpOw0KLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIlxuXHRcdHJldHVybiBpICsgaztcblx0fVxufSIpOw0KLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7DQotCQlyZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7DQotCQlyZXR1cm4gImNvbS5leGFtcGxlIjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvbigpIHsNCi0gICAgICAgIHRyeSB7DQotICAgICAgICAgICAgLy9AV2ViU2VydmljZQ0KLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJXZWJTZXJ2aWNlIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViU2VydmljZSA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm5hbWUiLCAiQ2FsY3VsYXRvciIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sIG5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOw0KLQ0KLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2VSZWYNCi0gICAgICAgICAgICBJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKCJteUZpZWxkIik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgIldlYlNlcnZpY2VSZWYiKSk7DQotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZVJlZik7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlUmVmIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7DQotDQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlUmVmOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZkFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOw0KLSAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1hcHBlZE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTWVtYmVyVmFsdWVQYWlyKGFzdCwgIm1hcHBlZE5hbWUiLCAibXlGaWVsZCIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZVJlZkFubm90YXRpb24sIG1hcHBlZE5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGZpZWxkLCBXZWJTZXJ2aWNlUmVmLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsNCi0NCi0gICAgICAgICAgICAvL0BXZWJNZXRob2QNCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHR5cGUuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgIldlYk1ldGhvZCIpKTsNCi0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYk1ldGhvZCk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJNZXRob2QgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsNCi0NCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViTWV0aG9kOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMCk7DQotICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAib3BlcmF0aW9uTmFtZSIsICJhZGQiKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICBBbm5vdGF0aW9uVXRpbHMuYWRkTWVtYmVyVmFsdWVQYWlyKHdlYk1ldGhvZEFubm90YXRpb24sIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIpOw0KLSAgICAgICAgICAgIHdlYk1ldGhvZEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obWV0aG9kLCBXZWJNZXRob2QuY2xhc3MpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotDQotICAgICAgICAgICAgLy9AV2ViUGFyYW0NCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQobG9jYWxWYXJpYWJsZSwgIldlYlBhcmFtIikpOw0KLSAgICAgICAgICAgIEFubm90YXRpb24gd2ViUGFyYW0gPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7DQotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJQYXJhbSk7DQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbSBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOw0KLQ0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlBhcmFtOw0KLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViUGFyYW1Bbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAwKTsNCi0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBwYXJ0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdNZW1iZXJWYWx1ZVBhaXIoYXN0LCAicGFydE5hbWUiLCAiaSIpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy5hZGRNZW1iZXJWYWx1ZVBhaXIod2ViUGFyYW1Bbm5vdGF0aW9uLCBwYXJ0TmFtZVZhbHVlUGFpcik7DQotICAgICAgICAgICAgd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKGxvY2FsVmFyaWFibGUsIFdlYlBhcmFtLmNsYXNzKTsNCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7DQotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7DQotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLSAgICAgICAgfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9KQVhXU0NvcmVUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9KQVhXU0NvcmVUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlYmYxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvSkFYV1NDb3JlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSkFYV1NDb3JlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBKQVhXU0NvcmVUZXN0U3VpdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSkFYV1NDb3JlVGVzdFN1aXRlKCkgewotICAgICAgICBzdXBlcigiSkFYLVdTIENvcmUgVGVzdHMiKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub1R5cGVUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoQWRkQW5ub3RhdGlvblRvRmllbGRUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFJlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub01ldGhvZFRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZEFubm90YXRpb25Ub01ldGhvZFBhcmFtZXRlclRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKEFkZE1lbWJlclZhbHVlUGFpclRvQW5ub3RhdGlvblRlc3QuY2xhc3MpOwotICAgICAgICBhZGRUZXN0U3VpdGUoUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5jbGFzcyk7Ci0gICAgICAgIGFkZFRlc3RTdWl0ZShVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmNsYXNzKTsKLSAgICAgICAgYWRkVGVzdFN1aXRlKFVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmZkZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21GaWVsZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIk15Q2xhc3MuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIE15Q2xhc3Mge1xuXG5cdEBXZWJTZXJ2aWNlUmVmKClcblx0c3RhdGljIFN0cmluZyBzZXJ2aWNlO1xuXG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uRnJvbUZpZWxkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlUmVmLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSUZpZWxkIGZpZWxkID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJzZXJ2aWNlIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChmaWVsZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotCi0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KGZpZWxkLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChmaWVsZCwgV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGZpZWxkLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViU2VydmljZVJlZi5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpLmV4aXN0cygpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDcwYjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVBbm5vdGF0aW9uRnJvbU1ldGhvZFBhcmFtZXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4Lmp3cy5XZWJQYXJhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kUGFyYW1ldGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgicHVibGljIGNsYXNzIENhbGN1bGF0b3Ige1xuXG5cdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbShuYW1lPVwiaVwiKSIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW50IGksIGludCBrKSB7XG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViUGFyYW0uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RQYXJhbWV0ZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYlBhcmFtLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgSU1ldGhvZCBtZXRob2QgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCkuZ2V0TWV0aG9kKCJhZGQiLCBuZXcgU3RyaW5nW10geyAiSSIsICJJIiB9KTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWV0aG9kKTsKLQotICAgICAgICAgICAgSUxvY2FsVmFyaWFibGUgbG9jYWxWYXJpYWJsZSA9IEFubm90YXRpb25VdGlscy5nZXRMb2NhbFZhcmlhYmxlKG1ldGhvZCwgImkiKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBhbm5vdGF0aW9uKSk7Ci0gICAgICAgICAgICB0ZXh0RmlsZUNoYW5nZS5hZGRFZGl0KEFubm90YXRpb25VdGlscy5jcmVhdGVSZW1vdmVJbXBvcnRUZXh0RWRpdChsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KGxvY2FsVmFyaWFibGUsIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViUGFyYW0uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21NZXRob2RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmExYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiQ2FsY3VsYXRvci5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViTWV0aG9kO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxuXHRAV2ViTWV0aG9kXG5cdHB1YmxpYyBpbnQgYWRkKGludCBpLCBpbnQgaykgeyIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXG5cdFx0cmV0dXJuIGkgKyBrO1xuXHR9XG59Iik7Ci0gICAgICAgIHJldHVybiBjbGFzc0NvbnRlbnRzLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIEFubm90YXRpb25zQ29yZS5jcmVhdGVOb3JtYWxBbm5vdGF0aW9uKGFzdCwgV2ViTWV0aG9kLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25Gcm9tTWV0aG9kKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJNZXRob2QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpOwotCi0gICAgICAgICAgICBJTWV0aG9kIG1ldGhvZCA9IHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KG1ldGhvZCwgQW5ub3RhdGlvblV0aWxzCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYk1ldGhvZC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlQW5ub3RhdGlvblRleHRFZGl0KG1ldGhvZCwgYW5ub3RhdGlvbikpOwotICAgICAgICAgICAgdGV4dEZpbGVDaGFuZ2UuYWRkRWRpdChBbm5vdGF0aW9uVXRpbHMuY3JlYXRlUmVtb3ZlSW1wb3J0VGV4dEVkaXQobWV0aG9kLCBXZWJNZXRob2QuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhlY3V0ZUNoYW5nZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0ZXh0RmlsZUNoYW5nZSkpOwotCi0gICAgICAgICAgICBhc3NlcnRGYWxzZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsIEFubm90YXRpb25VdGlscwotICAgICAgICAgICAgICAgICAgICAuZ2V0QW5ub3RhdGlvbk5hbWUoYW5ub3RhdGlvbikpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHNvdXJjZS5nZXRJbXBvcnQoV2ViTWV0aG9kLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSkuZXhpc3RzKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1JlbW92ZUFubm90YXRpb25Gcm9tVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMzdkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS5Bbm5vdGF0aW9uc0NvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmFubm90YXRpb25zLmNvcmUudXRpbHMuQW5ub3RhdGlvblV0aWxzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiTXlDbGFzcy5qYXZhIjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiTXlDbGFzc1wiLCBlbmRwb2ludEludGVyZmFjZT1cIk15SW50ZXJmYWNlXCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgidGFyZ2V0TmFtZXNwYWNlPVwiaHR0cDovL2V4YW1wbGUuY29tL1wiLCBwb3J0TmFtZT1cIk15Q2xhc3NQb3J0XCIsICIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgic2VydmljZU5hbWU9XCJNeUNsYXNzU2VydmljZVwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgTXlDbGFzcyB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRwdWJsaWMgU3RyaW5nIG15TWV0aG9kKCkgeyIgKyAiXG5cdFx0cmV0dXJuIFwidHh0XCI7XG5cdH1cblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlTm9ybWFsQW5ub3RhdGlvbihhc3QsIFdlYlNlcnZpY2UuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbkZyb21UeXBlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJTZXJ2aWNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uKSkpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7Ci0KLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUFubm90YXRpb25UZXh0RWRpdChzb3VyY2UuZmluZFByaW1hcnlUeXBlKCksIGFubm90YXRpb24pKTsKLSAgICAgICAgICAgIHRleHRGaWxlQ2hhbmdlLmFkZEVkaXQoQW5ub3RhdGlvblV0aWxzLmNyZWF0ZVJlbW92ZUltcG9ydFRleHRFZGl0KHNvdXJjZS5maW5kUHJpbWFyeVR5cGUoKSwgV2ViU2VydmljZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkpKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleGVjdXRlQ2hhbmdlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRleHRGaWxlQ2hhbmdlKSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb25OYW1lKGFubm90YXRpb24pKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShzb3VyY2UuZ2V0SW1wb3J0KFdlYlNlcnZpY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvUmVtb3ZlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDAzMmY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9SZW1vdmVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFNoYW5lIENsYXJrZS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU2hhbmUgQ2xhcmtlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLnV0aWxzLkFubm90YXRpb25VdGlsczsKLQotcHVibGljIGNsYXNzIFJlbW92ZU1lbWJlclZhbHVlUGFpclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25UZXN0IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NDb250ZW50cygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjbGFzc0NvbnRlbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoInBhY2thZ2UgY29tLmV4YW1wbGU7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJTZXJ2aWNlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBXZWJTZXJ2aWNlKG5hbWU9XCJDYWxjdWxhdG9yXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVNZW1iZXJWYWx1ZVBhaXJGcm9tQW5ub3RhdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElUeXBlIHR5cGUgPSBzb3VyY2UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEFubm90YXRpb25VdGlscy5pc0Fubm90YXRpb25QcmVzZW50KHNvdXJjZSwgIldlYlNlcnZpY2UiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlNlcnZpY2UgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViU2VydmljZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2UgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgTm9ybWFsQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJTZXJ2aWNlOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlQW5ub3RhdGlvbi52YWx1ZXMoKS5zaXplKCkgPT0gMSk7Ci0KLSAgICAgICAgICAgIE1lbWJlclZhbHVlUGFpciBuYW1lVmFsdWVQYWlyID0gQW5ub3RhdGlvblV0aWxzLmdldE1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgIm5hbWUiKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnJlbW92ZU1lbWJlclZhbHVlUGFpcih3ZWJTZXJ2aWNlQW5ub3RhdGlvbiwgbmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICB3ZWJTZXJ2aWNlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBXZWJTZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDApOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgICAgICBmYWlsKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwYjViOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS51dGlsLkFwdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdFByb2plY3QgewotICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotICAgIAotICAgIHB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKHByb2plY3ROYW1lKTsKLSAgICAgICAgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgYWRkUHJvamVjdE5hdHVyZShnZXRQcm9qZWN0KCksIEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0KLSAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0sIG51bGwpOwotCi0gICAgICAgIGNyZWF0ZVNvdXJjZUZvbGRlcigpOwotICAgICAgICBhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0gICAgICAgIGNyZWF0ZU91dHB1dEZvbGRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlbmFibGVBbm5vdGF0aW9uUHJvY2Vzc2luZyhib29sZWFuIGVuYWJsZSkgewotICAgICAgICBBcHRDb25maWcuc2V0RW5hYmxlZChqYXZhUHJvamVjdCwgZW5hYmxlKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgZ2V0SlJFQ29udGFpbmVyRW50cnkoKSB7Ci0gICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNSW5zdGFsbCA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRWTUluc3RhbGwgIT0gbnVsbCAmJiBpc0phdmE2T3JHcmVhdGVySlJFKGRlZmF1bHRWTUluc3RhbGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIElWTUluc3RhbGxUeXBlW10gaW5zdGFsbFR5cGVzID0gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsVHlwZXMoKTsKLSAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSBpbnN0YWxsVHlwZSA6IGluc3RhbGxUeXBlcykgewotICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSBpbnN0YWxsVHlwZS5nZXRWTUluc3RhbGxzKCk7Ci0gICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotICAgICAgICAgICAgICAgIGlmIChpc0phdmE2T3JHcmVhdGVySlJFKHZtSW5zdGFsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgoaW5zdGFsbFR5cGUuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bUluc3RhbGwuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdEpSRUNvbnRhaW5lckVudHJ5KCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0phdmE2T3JHcmVhdGVySlJFKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7Ci0gICAgICAgIGlmICh2bUluc3RhbGwgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotICAgICAgICAgICAgSVZNSW5zdGFsbDIgdm1JbnN0YWxsMiA9IChJVk1JbnN0YWxsMikgdm1JbnN0YWxsOwotICAgICAgICAgICAgaWYgKHZtSW5zdGFsbDIuZ2V0SmF2YVZlcnNpb24oKS5jb21wYXJlVG8oSmF2YUNvcmUuVkVSU0lPTl8xXzYpID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSkuY3JlYXRlQ29tcGlsYXRpb25Vbml0KG5hbWUsIGNvbnRlbnRzLCBmYWxzZSwgbW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIHRydWUsIG1vbml0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0gICAgICAgIHJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOyAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTb3VyY2VGb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAgIElGb2xkZXIgc3JjRGlyID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIik7Ci0gICAgICAgIG1rZGlycyhzcmNEaXIpOyAgICAKLSAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0Rpci5nZXRGdWxsUGF0aCgpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgSUZvbGRlciBvdXRwdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJiaW4iKTsKLSAgICAgICAgbWtkaXJzKG91dHB1dERpcik7Ci0gICAgICAgIGdldEphdmFQcm9qZWN0KCkuc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0RGlyLmdldEZ1bGxQYXRoKCksIG1vbml0b3IpOwotICAgIH0KLQotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhUHJvamVjdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGggKyAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3VycmVudENsYXNzcGF0aEVudHJpZXMsIDAsIG5ld0NsYXNzcGF0aEVudHJpZXMsIDAsIAotICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGgpOwotICAgICAgICAgICAgbmV3Q2xhc3NwYXRoRW50cmllc1tjdXJyZW50Q2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gY2xhc3NwYXRoRW50cnk7Ci0gICAgICAgICAgICBqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoRW50cmllcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLSAgICAgICAgICAgIGptZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1Rlc3RQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkZWFlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVGVzdFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdCB7Ci0gICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQotICAgIHByaXZhdGUgSVByb2plY3QgdGVzdFByb2plY3Q7Ci0gICAgCi0gICAgcHVibGljIFRlc3RQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICBJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgICAgdGVzdFByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICB0ZXN0UHJvamVjdC5jcmVhdGUobW9uaXRvcik7Ci0gICAgICAgIHRlc3RQcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gdGVzdFByb2plY3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG5hdHVyZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBwcm9qZWN0RGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwcmV2aW91c05hdHVyZXMgPSBwcm9qZWN0RGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBuZXdOYXR1cmVzID0gbmV3IFN0cmluZ1twcmV2aW91c05hdHVyZXMubGVuZ3RoICsgMV07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzTmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldmlvdXNOYXR1cmVzLmxlbmd0aCk7Ci0gICAgICAgICAgICBuZXdOYXR1cmVzW3ByZXZpb3VzTmF0dXJlcy5sZW5ndGhdID0gbmF0dXJlOwotICAgICAgICAgICAgcHJvamVjdERlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocHJvamVjdERlc2NyaXB0aW9uLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgY2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgbWtkaXJzKGZpbmFsIElGb2xkZXIgZm9sZGVyKSB7Ci0gICAgCXRyeSB7Ci0JICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSAmJiBmb2xkZXIuZ2V0UGFyZW50KCkuaXNBY2Nlc3NpYmxlKCkpIHsKLQkgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlTWVtYmVyVmFsdWVQYWlyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRhZjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvY29yZS90ZXN0cy9VcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBTaGFuZSBDbGFya2UuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFNoYW5lIENsYXJrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsKLWltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07Ci1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7Ci1pbXBvcnQgamF2YXgueG1sLndzLldlYlNlcnZpY2VSZWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNZW1iZXJWYWx1ZVBhaXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RBbm5vdGF0aW9uVGVzdCB7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzQ29udGVudHMoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgY2xhc3NDb250ZW50cyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJwYWNrYWdlIGNvbS5leGFtcGxlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViU2VydmljZTtcbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiaW1wb3J0IGphdmF4Lmp3cy5XZWJNZXRob2Q7XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC5qd3MuV2ViUGFyYW07XG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoImltcG9ydCBqYXZheC54bWwud3MuV2ViU2VydmljZVJlZjtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJAV2ViU2VydmljZShuYW1lPVwiQ2FsY3VsYXRvclwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvciB7XG5cbiIpOwotICAgICAgICBjbGFzc0NvbnRlbnRzLmFwcGVuZCgiXHRAV2ViU2VydmljZVJlZihtYXBwZWROYW1lPVwibXlGaWVsZFwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBTdHJpbmcgbXlGaWVsZDtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdEBXZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cImFkZFwiKVxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcdHB1YmxpYyBpbnQgYWRkKEBXZWJQYXJhbShwYXJ0TmFtZT1cImlcIikgaW50IGksIGludCBrKSB7Iik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJcblx0XHRyZXR1cm4gaSArIGs7XG5cdH1cbn0iKTsKLSAgICAgICAgcmV0dXJuIGNsYXNzQ29udGVudHMudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJDYWxjdWxhdG9yLmphdmEiOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiAiY29tLmV4YW1wbGUiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZW1iZXJWYWx1ZVBhaXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvL0BXZWJTZXJ2aWNlCi0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJXZWJTZXJ2aWNlIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgV2ViU2VydmljZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHdlYlNlcnZpY2UpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJTZXJ2aWNlIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViU2VydmljZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgd2ViU2VydmljZTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sICJuYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKG5hbWVWYWx1ZVBhaXIpOwotICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBuYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiQ2FsY3VsYXRvciIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZU1lbWJlclZhbHVlUGFpcihuYW1lVmFsdWVQYWlyLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJTY2llbnRpZmljQ2FsY3VsYXRvciIpKTsKLSAgICAgICAgICAgIHdlYlNlcnZpY2VBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKHR5cGUsIFdlYlNlcnZpY2UuY2xhc3MpOwotICAgICAgICAgICAgbmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZUFubm90YXRpb24sICJuYW1lIik7Ci0gICAgICAgICAgICBuYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiU2NpZW50aWZpY0NhbGN1bGF0b3IiKSk7Ci0KLSAgICAgICAgICAgIC8vQFdlYlNlcnZpY2VSZWYKLSAgICAgICAgICAgIElGaWVsZCBmaWVsZCA9IHR5cGUuZ2V0RmllbGQoIm15RmllbGQiKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoQW5ub3RhdGlvblV0aWxzLmlzQW5ub3RhdGlvblByZXNlbnQoZmllbGQsICJXZWJTZXJ2aWNlUmVmIikpOwotICAgICAgICAgICAgQW5ub3RhdGlvbiB3ZWJTZXJ2aWNlUmVmID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJTZXJ2aWNlUmVmKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViU2VydmljZVJlZiBpbnN0YW5jZW9mIE5vcm1hbEFubm90YXRpb24pOwotCi0gICAgICAgICAgICBOb3JtYWxBbm5vdGF0aW9uIHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlNlcnZpY2VSZWY7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLnZhbHVlcygpLnNpemUoKSA9PSAxKTsKLQotICAgICAgICAgICAgTWVtYmVyVmFsdWVQYWlyIG1hcHBlZE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlNlcnZpY2VSZWZBbm5vdGF0aW9uLCAibWFwcGVkTmFtZSIpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXBwZWROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgbWFwcGVkTmFtZVZhbHVlID0gIChTdHJpbmdMaXRlcmFsKSBtYXBwZWROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1hcHBlZE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoIm15RmllbGQiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIobWFwcGVkTmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAiYW5vdGhlckZpZWxkIikpOwotICAgICAgICAgICAgd2ViU2VydmljZVJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24oZmllbGQsIFdlYlNlcnZpY2VSZWYuY2xhc3MpOwotICAgICAgICAgICAgbWFwcGVkTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViU2VydmljZVJlZkFubm90YXRpb24sICJtYXBwZWROYW1lIik7Ci0gICAgICAgICAgICBtYXBwZWROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG1hcHBlZE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobWFwcGVkTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygiYW5vdGhlckZpZWxkIikpOwotCi0gICAgICAgICAgICAvL0BXZWJNZXRob2QKLSAgICAgICAgICAgIElNZXRob2QgbWV0aG9kID0gdHlwZS5nZXRNZXRob2QoImFkZCIsIG5ldyBTdHJpbmdbXSB7ICJJIiwgIkkiIH0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChtZXRob2QsICJXZWJNZXRob2QiKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYk1ldGhvZCA9IEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwod2ViTWV0aG9kKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUod2ViTWV0aG9kIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViTWV0aG9kQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB3ZWJNZXRob2Q7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYk1ldGhvZEFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgb3BlcmF0aW9uTmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViTWV0aG9kQW5ub3RhdGlvbiwgIm9wZXJhdGlvbk5hbWUiKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3BlcmF0aW9uTmFtZVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIG9wZXJhdGlvbk5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgb3BlcmF0aW9uTmFtZVZhbHVlUGFpci5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvcGVyYXRpb25OYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJhZGQiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIob3BlcmF0aW9uTmFtZVZhbHVlUGFpciwgQW5ub3RhdGlvbnNDb3JlLmNyZWF0ZVN0cmluZ0xpdGVyYWwoYXN0LCAibXVsdGlwbHkiKSk7Ci0gICAgICAgICAgICB3ZWJNZXRob2RBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEFubm90YXRpb25VdGlscy5nZXRBbm5vdGF0aW9uKG1ldGhvZCwgV2ViTWV0aG9kLmNsYXNzKTsKLSAgICAgICAgICAgIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYk1ldGhvZEFubm90YXRpb24sICJvcGVyYXRpb25OYW1lIik7Ci0gICAgICAgICAgICBvcGVyYXRpb25OYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIG9wZXJhdGlvbk5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUob3BlcmF0aW9uTmFtZVZhbHVlLmdldExpdGVyYWxWYWx1ZSgpLmVxdWFscygibXVsdGlwbHkiKSk7Ci0KLSAgICAgICAgICAgIC8vQFdlYlBhcmFtCi0gICAgICAgICAgICBJTG9jYWxWYXJpYWJsZSBsb2NhbFZhcmlhYmxlID0gQW5ub3RhdGlvblV0aWxzLmdldExvY2FsVmFyaWFibGUobWV0aG9kLCAiaSIpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChsb2NhbFZhcmlhYmxlLCAiV2ViUGFyYW0iKSk7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uIHdlYlBhcmFtID0gQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24obG9jYWxWYXJpYWJsZSwgV2ViUGFyYW0uY2xhc3MpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh3ZWJQYXJhbSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHdlYlBhcmFtIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgICAgIE5vcm1hbEFubm90YXRpb24gd2ViUGFyYW1Bbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIHdlYlBhcmFtOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh3ZWJQYXJhbUFubm90YXRpb24udmFsdWVzKCkuc2l6ZSgpID09IDEpOwotCi0gICAgICAgICAgICBNZW1iZXJWYWx1ZVBhaXIgcGFydE5hbWVWYWx1ZVBhaXIgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0TWVtYmVyVmFsdWVQYWlyKHdlYlBhcmFtQW5ub3RhdGlvbiwgInBhcnROYW1lIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHBhcnROYW1lVmFsdWVQYWlyKTsKLSAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgcGFydE5hbWVWYWx1ZSA9ICAoU3RyaW5nTGl0ZXJhbCkgcGFydE5hbWVWYWx1ZVBhaXIuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocGFydE5hbWVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImkiKSk7Ci0KLSAgICAgICAgICAgIEFubm90YXRpb25VdGlscy51cGRhdGVNZW1iZXJWYWx1ZVBhaXIocGFydE5hbWVWYWx1ZVBhaXIsIEFubm90YXRpb25zQ29yZS5jcmVhdGVTdHJpbmdMaXRlcmFsKGFzdCwgImlpaSIpKTsKLSAgICAgICAgICAgIHdlYlBhcmFtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbihsb2NhbFZhcmlhYmxlLCBXZWJQYXJhbS5jbGFzcyk7Ci0gICAgICAgICAgICBwYXJ0TmFtZVZhbHVlUGFpciA9IEFubm90YXRpb25VdGlscy5nZXRNZW1iZXJWYWx1ZVBhaXIod2ViUGFyYW1Bbm5vdGF0aW9uLCAicGFydE5hbWUiKTsKLSAgICAgICAgICAgIHBhcnROYW1lVmFsdWUgPSAgKFN0cmluZ0xpdGVyYWwpIHBhcnROYW1lVmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHBhcnROYW1lVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJpaWkiKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLSAgICAgICAgICAgIGZhaWwoY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9jb3JlL3Rlc3RzL1VwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYTE0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2NvcmUvdGVzdHMvVXBkYXRlU2luZ2xlTWVtYmVyQW5ub3RhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgU2hhbmUgQ2xhcmtlLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTaGFuZSBDbGFya2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuY29yZS50ZXN0czsKLQotaW1wb3J0IGphdmF4LnhtbC53cy5CaW5kaW5nVHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuYW5ub3RhdGlvbnMuY29yZS51dGlscy5Bbm5vdGF0aW9uVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvblRlc3QgewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc0NvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzQ29udGVudHMgPSBuZXcgU3RyaW5nQnVpbGRlcigicGFja2FnZSBjb20uZXhhbXBsZTtcblxuIik7Ci0gICAgICAgIGNsYXNzQ29udGVudHMuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLndzLkJpbmRpbmdUeXBlO1xuXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoIkBCaW5kaW5nVHlwZShcImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC9odHRwXCIpXG4iKTsKLSAgICAgICAgY2xhc3NDb250ZW50cy5hcHBlbmQoInB1YmxpYyBjbGFzcyBDYWxjdWxhdG9yIHtcblxufSIpOwotICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50cy50b1N0cmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gIkNhbGN1bGF0b3IuamF2YSI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuICJjb20uZXhhbXBsZSI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJVHlwZSB0eXBlID0gc291cmNlLmZpbmRQcmltYXJ5VHlwZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uVXRpbHMuaXNBbm5vdGF0aW9uUHJlc2VudChzb3VyY2UsICJCaW5kaW5nVHlwZSIpKTsKLSAgICAgICAgICAgIEFubm90YXRpb24gYmluZGluZ1R5cGUgPSBBbm5vdGF0aW9uVXRpbHMuZ2V0QW5ub3RhdGlvbih0eXBlLCBCaW5kaW5nVHlwZS5jbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJpbmRpbmdUeXBlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZ1R5cGUgaW5zdGFuY2VvZiBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKTsKLQotICAgICAgICAgICAgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBiaW5kaW5nVHlwZUFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYmluZGluZ1R5cGU7Ci0gICAgICAgICAgICBTdHJpbmdMaXRlcmFsIGJpbmRpbmdUeXBlVmFsdWUgPSAoU3RyaW5nTGl0ZXJhbCkgYmluZGluZ1R5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJpbmRpbmdUeXBlVmFsdWUuZ2V0TGl0ZXJhbFZhbHVlKCkuZXF1YWxzKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvaHR0cCIpKTsKLQotICAgICAgICAgICAgQW5ub3RhdGlvblV0aWxzLnVwZGF0ZVNpbmdsZU1lbWJlckFubm90YXRpb24oYmluZGluZ1R5cGVBbm5vdGF0aW9uLCBBbm5vdGF0aW9uc0NvcmUuY3JlYXRlU3RyaW5nTGl0ZXJhbChhc3QsICJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAvYmluZGluZ3MvSFRUUC8iKSk7Ci0gICAgICAgICAgICBiaW5kaW5nVHlwZUFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgQW5ub3RhdGlvblV0aWxzLmdldEFubm90YXRpb24odHlwZSwgQmluZGluZ1R5cGUuY2xhc3MpOwotICAgICAgICAgICAgYmluZGluZ1R5cGVWYWx1ZSA9IChTdHJpbmdMaXRlcmFsKSBiaW5kaW5nVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmluZGluZ1R5cGVWYWx1ZS5nZXRMaXRlcmFsVmFsdWUoKS5lcXVhbHMoImh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDUvc29hcC9iaW5kaW5ncy9IVFRQLyIpKTsKLSAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotICAgICAgICAgICAgZmFpbChjZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzUzNjc1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZWQ2MjI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24sDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwNCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLA0KLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLA0KLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLA0KLSBvcmcuZWNsaXBzZS51aS5pZGUsDQotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLA0KLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LA0KLSBvcmcuZWNsaXBzZS5qZHQudWksDQotIG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZQ0KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLmRvbSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLmFjdGlvbnMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4OGVmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1YzQ1MWFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1ET00gSW50ZWdyYXRpb24gVGVzdHMgKEluY3ViYXRpb24pDQotQnVuZGxlLVZlbmRvci4wPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9kb20vQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ODc1MDJmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvZG9tL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5kb207DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Ow0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3IuV2ViU2VydmljZURlY29yYXRvclRlc3Q7DQotDQotcHVibGljIGNsYXNzIEFsbFRlc3RzU3VpdGUNCi17DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpDQotCXsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV2ViU2VydmljZURlY29yYXRvclRlc3QuY2xhc3MpOw0KLQkJDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDRmYzExZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JTG9hZGluZ1dzUHJvamVjdC5JTG9hZGluZ0NhbmNlbGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklMb2FkaW5nV3NQcm9qZWN0LklMb2FkaW5nRHVtbXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JV2ViU2VydmljZUNoaWxkTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JU2VydmljZUVuZHBvaW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdzRE9NUnVudGltZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLkRvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3RzVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAKLXsKLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyAKLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMTsKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7Ci0JCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7Ci0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5OwotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJSVByb2plY3QgZWpiUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZUVqYjNQcm9qZWN0KCJET01DbnRQcm92VGVzdFByb2plY3QxIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJdGVzdFByajEgPSBuZXcgVGVzdFByb2plY3QoZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQltb2RlbFN5bmMxID0gdGVzdFByajEuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxIik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTFOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMXtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKwotCQkJCSJ9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTJOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMiBleHRlbmRzIFNlaTEge1xuIiArCi0JCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG5hbWU9XCJ2b2lkTWV0aG9kV2l0aEFyZ3NcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhBcmdzKEBqYXZheC5qd3MuV2ViUGFyYW0obmFtZT1cInBhcmFtMVwiKSBqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IHBhcmFtMSk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzIuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzJOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzIge30iKTsKLQkJCi0JCXRhcmdldFJlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQkJdGFyZ2V0UmVzb3VyY2UubG9hZChudWxsKTsKLQkJCi0JCXRoaXMud3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXRSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCQkKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSAKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChmaW5hbCBJRE9NIGRvbSwgZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQkJCXJldHVybiB3c1Byb2plY3Q7Ci0JCQl9Ci0JCX07Ci0JCQotCQl0YXJnZXRSZXNvdXJjZS5zdGFydFN5bmNocm9uaXppbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGFyZ2V0UmVzb3VyY2Uuc3RvcFN5bmNocm9uaXppbmcoKTsKLQkJdGVzdFByajEuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoKSAKLQl7Ci0JCWFzc2VydE5vdE51bGwoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUoYWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckZhY3RvcnkoKSBpbnN0YW5jZW9mIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIAotCXsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobmV3IERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGlsZHJlbkxpc3RzT2JqZWN0KCkgCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMSk7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJV2ViU2VydmljZVByb2plY3QpOwotCQkKLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkcmVuLmxlbmd0aCwgMik7Ci0JCWFzc2VydFRydWUoY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblsxXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOwotCQlhc3NlcnRFcXVhbHMoMywgc0VJcy5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKHNFSXNbMF0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJYXNzZXJ0VHJ1ZShzRUlzWzFdIGluc3RhbmNlb2YgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCWFzc2VydFRydWUoc0VJc1syXSBpbnN0YW5jZW9mIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh3U3MpOwotCQlhc3NlcnRFcXVhbHMod1NzLmxlbmd0aCwgMik7Ci0JCWFzc2VydFRydWUod1NzWzBdIGluc3RhbmNlb2YgSVdlYlNlcnZpY2UpOwotCQlhc3NlcnRUcnVlKHdTc1sxXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc0NoaWxkcmVuT2JqZWN0KCkgCi0JewotCQkvLyBJV2ViU2VydmljZVByb2plY3QKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOwotCQkKLQkJLy8gSVNFSUNoaWxkTGlzdCAmIElXZWJTZXJ2aWNlQ2hpbGRMaXN0Ci0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihjaGlsZHJlblswXSkpOwotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKGNoaWxkcmVuWzFdKSk7Ci0JCQotCQkvLyBudWxsIHBhcmFtZXRlcgotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihudWxsKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbklXZWJTZXJ2aWNlKCkKLQl7Ci0JCUlXZWJTZXJ2aWNlIHdzID0gZmluZFdzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuV1MxIik7Ci0JCWFzc2VydE5vdE51bGwod3MpOwotCQlhc3NlcnRUcnVlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKHdzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cykubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cylbMF0gaW5zdGFuY2VvZiBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKLQkJCi0JCS8vIGNoZWNrIGlmIGFkYXB0ZWQgb25seSBvbmNlCi0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQlvdGhlckZhY3RvcnkuZ2V0Q2hpbGRyZW4od3MpOwotCQlhc3NlcnRFcXVhbHMoMiwgd3MuZUFkYXB0ZXJzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENoaWxkcmVuSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihzZWkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNlaSkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzZWkpWzBdIGluc3RhbmNlb2YgSVdlYk1ldGhvZCk7Ci0JCURPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIG90aGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQlvdGhlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc2VpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlaS5lQWRhcHRlcnMoKS5zaXplKCkpOwotCQkKLQkJSVdlYlNlcnZpY2Ugd3MgPSBmaW5kV3MoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5XUzIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cyk7Ci0JCWFzc2VydEZhbHNlKGFkYXB0ZXJGYWN0b3J5Lmhhc0NoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih3cy5nZXRTZXJ2aWNlRW5kcG9pbnQoKSkubGVuZ3RoKTsKLQkJLy8gY2hlY2sgaWYgYWRhcHRlZCBvbmx5IG9uY2UKLQkJb3RoZXJGYWN0b3J5LmdldENoaWxkcmVuKHdzLmdldFNlcnZpY2VFbmRwb2ludCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHdzLmdldFNlcnZpY2VFbmRwb2ludCgpLmVBZGFwdGVycygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDaGlsZHJlbldlYk1ldGhvZCgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwkKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihtZXRob2QpWzBdIGluc3RhbmNlb2YgSVdlYlBhcmFtKTsKLQkJCi0JCSBtZXRob2QgPSBmaW5kTWV0aG9kKHNlaSwgInZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKG1ldGhvZCkubGVuZ3RoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5XZWJQYXJhbSgpCi0JewotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA9IGZpbmRTZWkoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMS5TZWkyIik7Ci0JCWFzc2VydE5vdE51bGwoc2VpKTsKLQkJCi0JCUlXZWJNZXRob2QgbWV0aG9kID0gZmluZE1ldGhvZChzZWksICJ2b2lkTWV0aG9kV2l0aEFyZ3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQlhc3NlcnRGYWxzZShhZGFwdGVyRmFjdG9yeS5oYXNDaGlsZHJlbihtZXRob2QuZ2V0UGFyYW1ldGVycygpLmdldCgwKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obWV0aG9kLmdldFBhcmFtZXRlcnMoKS5nZXQoMCkpLmxlbmd0aCk7Ci0JfQotCQotCQotCXByaXZhdGUgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmaW5kU2VpKGZpbmFsIFN0cmluZyBpbXBsTmFtZSkKLQl7Ci0JCWZvcihJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSA6IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkpIAotCQl7Ci0JCQlpZihzZWkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoaW1wbE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHNlaTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIElXZWJTZXJ2aWNlIGZpbmRXcyhmaW5hbCBTdHJpbmcgaW1wbE5hbWUpCi0JewotCQlmb3IoSVdlYlNlcnZpY2Ugd3MgOiB3c1Byb2plY3QuZ2V0V2ViU2VydmljZXMoKSkgCi0JCXsKLQkJCWlmKHdzLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKGltcGxOYW1lKSkgewotCQkJCXJldHVybiB3czsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIElXZWJNZXRob2QgZmluZE1ldGhvZChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIAotCXsKLQkJZm9yKElXZWJNZXRob2QgbWV0aG9kIDogc2VpLmdldFdlYk1ldGhvZHMoKSkgCi0JCXsKLQkJCWlmKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdE5vdGlmeUNoYW5nZWQoKQotLy8JewotLy8JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLS8vCQkKLS8vCQl0cnkKLS8vCQl7Ci0vLwkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIlNlaTMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIlNlaTNOYW1lXCIpIHB1YmxpYyBpbnRlcmZhY2UgU2VpMyB7fSIpOwotLy8JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJXUzMuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzNOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTNcIikgcHVibGljIGNsYXNzIFdTMyB7fSIpOwotLy8JCX0KLS8vCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkKLS8vCQl7Ci0vLwkJCWZhaWwoZS50b1N0cmluZygpKTsKLS8vCQl9Ci0vLwkJCi0vLwkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0vLwkJCi0vLwkJT2JqZWN0W10gc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoc0VJcy5sZW5ndGgsIDMpOwotLy8JCQotLy8JCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzFdKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMod1NzLmxlbmd0aCwgMyk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdTUHJvamVjdCgpCi0JewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpOwotCQkKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGNoaWxkcmVuKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdERvbU5vdExvYWRlZCgpCi0JewotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nV3NQcm9qZWN0KTsKLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRXc1Byb2plY3RDaGlsZHNEb21Mb2FkTm90Q2FuY2VsZWQoKQotCXsKLQkJSUxvYWRpbmdXc1Byb2plY3QgbG9hZGluZ1Byb2plY3QgPSBuZXcgSUxvYWRpbmdXc1Byb2plY3QoKSB7Ci0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsgcmV0dXJuIG51bGw7IH0KLQkJCXB1YmxpYyBib29sZWFuIGlzTG9hZENhbmNlbGVkKCkge3JldHVybiBmYWxzZTt9Ci0JCX07Ci0JCQkKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihsb2FkaW5nUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZHJlbi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKGNoaWxkcmVuWzBdIGluc3RhbmNlb2YgSUxvYWRpbmdEdW1teSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFdzUHJvamVjdENoaWxkc0RvbUxvYWRDYW5jZWxlZCgpCi0JewotCQlJTG9hZGluZ1dzUHJvamVjdCBsb2FkaW5nUHJvamVjdCA9IG5ldyBJTG9hZGluZ1dzUHJvamVjdCgpIHsKLQkJCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeyByZXR1cm4gbnVsbDsgfQotCQkJcHVibGljIGJvb2xlYW4gaXNMb2FkQ2FuY2VsZWQoKSB7cmV0dXJuIHRydWU7fQotCQl9OwotCQkJCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4obG9hZGluZ1Byb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRyZW4ubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZHJlblswXSBpbnN0YW5jZW9mIElMb2FkaW5nQ2FuY2VsZWQpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdXBwb3J0aW5nUnVudGltZSgpCi0JewotCQlET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlck15IHByb3ZpZGVyID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkoKTsKLQkJSVdzRE9NUnVudGltZUV4dGVuc2lvbiBydW50aW1lID0gcHJvdmlkZXIuZ2V0U3VwcG9ydGluZ1J1bnRpbWUodGVzdFByajEuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW50aW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyTXkgZXh0ZW5kcyBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJV3NET01SdW50aW1lRXh0ZW5zaW9uIGdldFN1cHBvcnRpbmdSdW50aW1lKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRTdXBwb3J0aW5nUnVudGltZShwcm9qZWN0KTsKLQkJfQotCX07Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNkNDFjMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklET007Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLnBlcnNpc3RlbmNlLkpheFdzV29ya3NwYWNlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsKLQotcHVibGljIGNsYXNzIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSAKLXsKLQlwcml2YXRlIFRlc3RQcm9qZWN0IHRlc3RQcmoxOyAKLQkKLQlwcm90ZWN0ZWQgSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWRhcHRlckZhY3Rvcnk7Ci0JcHJvdGVjdGVkIERPTUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gCi0JewotCQlJUHJvamVjdCBlamJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkRPTUxibFByb3ZUZXN0UHJvamVjdDEiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQl0ZXN0UHJqMSA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbW9kZWxTeW5jMSA9IHRlc3RQcmoxLmNyZWF0ZVBhY2thZ2UoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsKLQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2QobmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsKLQkJCQkifSIpOwotCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKwotCQkJCSJAamF2YXguandzLldlYk1ldGhvZChuYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKwotCQkJCSJ9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7Ci0JCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMk5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MyIHt9Iik7Ci0JCQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7Ci0JCXRhcmdldFJlc291cmNlLmxvYWQobnVsbCk7Ci0JCXRoaXMud3NQcm9qZWN0ID0gRG9tVXRpbC5JTlNUQU5DRS5maW5kUHJvamVjdEJ5TmFtZSh0YXJnZXRSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCQkKLQkJCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgRE9NQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQlyZXR1cm4gd3NQcm9qZWN0OwotCQkJfQkJCQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbWFnZU9iamVjdCgpIAotCXsKLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMS5nZXRQcm9qZWN0KCkpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzBdKSk7Ci0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKGNoaWxkcmVuWzFdKSk7Ci0JCQotCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHNFSXNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZShzRUlzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZSh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uoc0VJc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldEltYWdlKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdTc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHNFSXNbMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldEltYWdlKHdlYk1ldGhvZHNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZShudWxsKSwgbGFiZWxQcm92aWRlci5nZXRJbWFnZSh3ZWJNZXRob2RzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRJbWFnZSh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uod2ViTWV0aG9kc1swXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZXh0T2JqZWN0KCkgCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChjaGlsZHJlblswXSkpOwotCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMF0pKTsKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQoY2hpbGRyZW5bMV0pKTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChzRUlzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHNFSXNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldFRleHQodGVzdFByajEpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQoc0VJc1swXSkpOwotCQkKLQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMV0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChsYWJlbFByb3ZpZGVyLmdldFRleHQod1NzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChudWxsKSwgbGFiZWxQcm92aWRlci5nZXRUZXh0KHdTc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3U3NbMF0pKTsKLQkJCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihzRUlzWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXRUZXh0KHdlYk1ldGhvZHNbMF0pKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXRUZXh0KG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldFRleHQod2ViTWV0aG9kc1swXSkpOwotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dCh3ZWJNZXRob2RzWzBdKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdGlvbigpCi0JewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMF0pKTsKLQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihjaGlsZHJlblswXSkpOwotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oY2hpbGRyZW5bMV0pKTsKLQkJCi0JCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc0VJc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHNFSXNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbihzRUlzWzBdKSk7Ci0JCQotCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblsxXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24obnVsbCksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCWFzc2VydE5vdFNhbWUobGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih0ZXN0UHJqMSksIGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od1NzWzBdKSk7Ci0JCQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oc0VJc1swXSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGxhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24od2ViTWV0aG9kc1swXSkpOwotCQkKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKG51bGwpLCBsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHdlYk1ldGhvZHNbMF0pKTsKLQkJYXNzZXJ0Tm90U2FtZShsYWJlbFByb3ZpZGVyLmdldERlc2NyaXB0aW9uKHRlc3RQcmoxKSwgbGFiZWxQcm92aWRlci5nZXREZXNjcmlwdGlvbih3ZWJNZXRob2RzWzBdKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTdmOTExNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9ET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy5uYXZpZ2F0b3I7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLkRPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklXZWJTZXJ2aWNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOw0KLQ0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSANCi17DQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyKCkgDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXIocHJvcGVydHlBZGFwdGVyRmFjdG9yeSwgSVByb3BlcnR5U291cmNlUHJvdmlkZXIuY2xhc3MpKTsNCi0JCWFzc2VydE51bGwocHJvcGVydHlBZGFwdGVyRmFjdG9yeS5nZXRBZGFwdGVyKHByb3BlcnR5QWRhcHRlckZhY3RvcnksIElXZWJTZXJ2aWNlLmNsYXNzKSk7DQotCQlhc3NlcnRUcnVlKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcykgaW5zdGFuY2VvZiBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcik7DQotCQlhc3NlcnRUcnVlKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeS5jbGFzcykgaW5zdGFuY2VvZiBET01Qcm9wZXJ0eVZpZXdBZGFwdGVyRmFjdG9yeSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldEFkYXB0ZXJMaXN0KCkgDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LmdldEFkYXB0ZXJMaXN0KCkpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckxpc3QoKS5sZW5ndGgsIDEpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlckxpc3QoKVswXSwgRE9NQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuY2xhc3MpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWRhcHRlclVzZXNTYW1lRmFjdG9yeSgpDQotCXsNCi0JCURPTVByb3BlcnR5Vmlld0FkYXB0ZXJGYWN0b3J5IHByb3BlcnR5QWRhcHRlckZhY3RvcnkgPSBuZXcgRE9NUHJvcGVydHlWaWV3QWRhcHRlckZhY3RvcnkoKTsNCi0JCU9iamVjdCBhZGFwdGVyMSA9IHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcyk7DQotCQlhc3NlcnROb3ROdWxsKGFkYXB0ZXIxKTsNCi0JCU9iamVjdCBhZGFwdGVyMiA9IHByb3BlcnR5QWRhcHRlckZhY3RvcnkuZ2V0QWRhcHRlcihwcm9wZXJ0eUFkYXB0ZXJGYWN0b3J5LCBJUHJvcGVydHlTb3VyY2VQcm92aWRlci5jbGFzcyk7DQotCQlhc3NlcnRUcnVlKGFkYXB0ZXIxPT1hZGFwdGVyMik7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvV2ViU2VydmljZURlY29yYXRvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL1dlYlNlcnZpY2VEZWNvcmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhlZTNlYWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL2RvbS9pbnRlZ3JhdGlvbi90ZXN0cy9uYXZpZ2F0b3IvV2ViU2VydmljZURlY29yYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZS5pbnRlcm5hbC5BcHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5JU0VJQ2hpbGRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLklXZWJTZXJ2aWNlQ2hpbGRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLldlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuRG9tVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Xc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUucGVyc2lzdGVuY2UuSmF4V3NXb3Jrc3BhY2VSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Bc3NlcnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuYXNzZXJ0aW9ucy5Db25kaXRpb25DaGVja0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LlRlc3RQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbkluc3BlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgV2ViU2VydmljZURlY29yYXRvcn0gY2xhc3MKLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VEZWNvcmF0b3JUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlCi17Ci0gICAgcHJpdmF0ZSBNeVdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBkZWNvcmF0b3I7Ci0gICAgcHJpdmF0ZSBUZXN0UHJvamVjdCB0ZXN0UHJvamVjdDsKLQotICAgIHByaXZhdGUgSVdlYlNlcnZpY2Ugd3M7Ci0gICAgcHJpdmF0ZSBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIHNlaTsKLSAgICBwcml2YXRlIElXZWJTZXJ2aWNlUHJvamVjdCB3c1Byb2plY3Q7Ci0gICAgcHJpdmF0ZSBJV2ViTWV0aG9kIHdlYk1ldGhvZDsKLSAgICBwcml2YXRlIElXZWJQYXJhbSB3ZWJQYXJhbTsKLSAgICBwcml2YXRlIE1vY2s8SVdlYlNlcnZpY2VDaGlsZExpc3Q+IHdzQ2hpbGRMaXN0OwotICAgIHByaXZhdGUgTW9jazxJU0VJQ2hpbGRMaXN0PiBzZWlDaGlsZExpc3Q7Ci0gICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IHRlc3RQYWNrYWdlOwotCi0gICAgcHJpdmF0ZSBJVHlwZSBzZWlUeXBlOwotICAgIHByaXZhdGUgSVR5cGUgd3NJbXBsVHlwZTsKLSAgICAKLSAgICBwcml2YXRlIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgamF4d3NSZXNvdXJjZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT19FUlJPUiA9IDA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VJX0NPTlRFTlQgPSAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJ7MH1cIilcbiIgKyAicHVibGljIGludGVyZmFjZSBJU2VpICd7J1xuIiArICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwiezF9XCIpXG4iCi0gICAgKyAicHVibGljIHZvaWQgdGVzdE1ldGhvZChAamF2YXguandzLldlYlBhcmFtKG5hbWU9XCJ7Mn1cIikgU3RyaW5nIHMpO30iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMX0NPTlRFTlQgPSAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPVwiezB9XCIsIGVuZHBvaW50SW50ZXJmYWNlPVwidGVzdC5JU2VpXCIpXG4iICsgInB1YmxpYyBjbGFzcyBFbmRwb2ludENsYXNzICd7J1xuIgotICAgICsgInB1YmxpYyB2b2lkIHRlc3RNZXRob2QoU3RyaW5nIHMpJ3snfX0iOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZGVjb3JhdG9yID0gbmV3IE15V2ViU2VydmljZVByb2JsZW1zRGVjb3JhdG9yKCk7Ci0gICAgICAgIHRlc3RQcm9qZWN0ID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh0ZXN0UHJvamVjdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0UHJvamVjdC5kaXNwb3NlKCk7Ci0gICAgCQlqYXh3c1Jlc291cmNlLnN0b3BTeW5jaHJvbml6aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudEZvck9iamVjdCgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3MobmV3IE9iamVjdCgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVBZG9ybm1lbnROb1ZhbGlkYXRpb25FcnJvcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjcmVhdGVXc0NvbnRlbnQoIk15UG9ydCIsICJteU1ldGhvZCIsICJteVBhcmFtIiwgIk15U2VydmljZSIpOwotICAgICAgICBpbml0V3NEb21PYmplY3RzKCk7Ci0gICAgICAgIGNoZWNrTm9FcnJvcnNBZG9ybm1lbnQoKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHV0ZUFkb3JubWVudEZvclNlaUVycm9yKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJY3JlYXRlV3NDb250ZW50KCIiLCAibXlNZXRob2QiLCAibXlQYXJhbSIsICJNeVNlcnZpY2UiKTsKLQkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLQkJaW5pdFdzRG9tT2JqZWN0cygpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLQotCQlmaXhBcHRFcnJvcnMoKTsKLQkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yV2ViTWV0aG9kRXJyb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQljcmVhdGVXc0NvbnRlbnQoIk15UG9ydCIsICIiLCAibXlQYXJhbSIsICJNeVNlcnZpY2UiKTsKLQkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLQkJaW5pdFdzRG9tT2JqZWN0cygpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLQotCQlmaXhBcHRFcnJvcnMoKTsKLQkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yV2ViUGFyYW1FcnJvcigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBXc0RPTUxvYWRDYW5jZWxlZEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCWNyZWF0ZVdzQ29udGVudCgiTXlQb3J0IiwgIk15TWV0aG9kIiwgIiIsICJNeVNlcnZpY2UiKTsKLQkJd2FpdEZvckFwdE1hcmtlcnNBcHBlYXIoKTsKLQkJaW5pdFdzRG9tT2JqZWN0cygpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3NDaGlsZExpc3QucHJveHkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpQ2hpbGRMaXN0LnByb3h5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIEphdmFFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYk1ldGhvZCkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViUGFyYW0pKTsKLQotCQlmaXhBcHRFcnJvcnMoKTsKLQkJY2hlY2tOb0Vycm9yc0Fkb3JubWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wdXRlQWRvcm5tZW50Rm9yV3NJbXBsRXJyb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgV3NET01Mb2FkQ2FuY2VsZWRFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQljcmVhdGVXc0NvbnRlbnQoIk15UG9ydCIsICJNeU1ldGhvZCIsICJteVBhcmFtIiwgIiIpOwotCQl3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpOwotCQlpbml0V3NEb21PYmplY3RzKCk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBKYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvci5FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3c0NoaWxkTGlzdC5wcm94eSgpKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyhzZWlDaGlsZExpc3QucHJveHkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgSmF2YUVsZW1lbnRJbWFnZURlc2NyaXB0b3IuRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaSkpOwotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mod2ViTWV0aG9kKSk7Ci0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJQYXJhbSkpOwotCi0JCWZpeEFwdEVycm9ycygpOwotCQljaGVja05vRXJyb3JzQWRvcm5tZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVdzQ29udGVudChmaW5hbCBTdHJpbmcgc2VpTmFtZSwgZmluYWwgU3RyaW5nIHdlYk1ldGhvZE5hbWUsIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVByb2plY3Qgd2ViUCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiV2ViVGVzdGVyIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJdGVzdFByb2plY3QgPSBuZXcgVGVzdFByb2plY3Qod2ViUCk7Ci0JCXRlc3RQcm9qZWN0LnNldEFwdFByb2Nlc3NpbmdFbmFibGVkKHRydWUsIGZhbHNlKTsKLQotCQlqYXh3c1Jlc291cmNlID0gbmV3IEpheFdzV29ya3NwYWNlUmVzb3VyY2UoSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpKTsKLQkJamF4d3NSZXNvdXJjZS5sb2FkKG51bGwpOwotCQlqYXh3c1Jlc291cmNlLnN0YXJ0U3luY2hyb25pemluZygpOwotCi0JCXRlc3RQYWNrYWdlID0gdGVzdFByb2plY3QuY3JlYXRlUGFja2FnZSgidGVzdCIpOwotCQlzZWlUeXBlID0gdGVzdFByb2plY3QuY3JlYXRlVHlwZSh0ZXN0UGFja2FnZSwgIklTZWkuamF2YSIsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNFSV9DT05URU5ULCBzZWlOYW1lLCB3ZWJNZXRob2ROYW1lLCBwYXJhbU5hbWUpKTsKLQkJd3NJbXBsVHlwZSA9IHRlc3RQcm9qZWN0LmNyZWF0ZVR5cGUodGVzdFBhY2thZ2UsICJFbmRwb2ludENsYXNzLmphdmEiLCBNZXNzYWdlRm9ybWF0LmZvcm1hdChJTVBMX0NPTlRFTlQsIHNlcnZpY2VOYW1lKSk7Ci0JCXRlc3RQcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQpOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0V3NEb21PYmplY3RzKCkgdGhyb3dzIFdzRE9NTG9hZENhbmNlbGVkRXhjZXB0aW9uCi0gICAgewotCQl0aGlzLndzUHJvamVjdCA9IERvbVV0aWwuSU5TVEFOQ0UuZmluZFByb2plY3RCeU5hbWUoamF4d3NSZXNvdXJjZS5nZXRET00oKSwgdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy53c1Byb2plY3QpOwotCi0gICAgICAgIHdzID0gd3NQcm9qZWN0LmdldFdlYlNlcnZpY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHNlaSA9IHdzUHJvamVjdC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHdlYk1ldGhvZCA9IHNlaS5nZXRXZWJNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHdlYlBhcmFtID0gd2ViTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICB3c0NoaWxkTGlzdCA9IG1vY2soSVdlYlNlcnZpY2VDaGlsZExpc3QuY2xhc3MpOwotICAgICAgICB3c0NoaWxkTGlzdC5zdHVicygpLm1ldGhvZCgiZ2V0V1NDaGlsZExpc3QiKS53aWxsKHJldHVyblZhbHVlKGVsaXN0KHdzKSkpOwotICAgICAgICBzZWlDaGlsZExpc3QgPSBtb2NrKElTRUlDaGlsZExpc3QuY2xhc3MpOwotICAgICAgICBzZWlDaGlsZExpc3Quc3R1YnMoKS5tZXRob2QoImdldFNFSUNoaWxkTGlzdCIpLndpbGwocmV0dXJuVmFsdWUoZWxpc3Qoc2VpKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3YWl0Rm9yQXB0TWFya2Vyc0FwcGVhcigpCi0gICAgewotICAgICAgICBBc3NlcnRpb25zLndhaXRBc3NlcnQobmV3IElXYWl0Q29uZGl0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5kQXB0TWFya2VycygpLnNpemUoKSA+IDA7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgIkFQVCBtYXJrZXJzIGRpZCBub3QgYXBwZWFyIik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJTWFya2VyPiBmaW5kQXB0TWFya2VycygpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgewotCQlmaW5hbCBDb2xsZWN0aW9uPElNYXJrZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SU1hcmtlcj4oKTsKLQkJZm9yKGZpbmFsIElNYXJrZXIgbSA6IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhBcHRQbHVnaW4uQVBUX0NPTVBJTEFUSU9OX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKSkKLQkJewotCQkJcmVzdWx0LmFkZChtKTsKLQkJfQotCQkKLQkJZm9yKGZpbmFsIElNYXJrZXIgbSA6IHRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWFya2VycyhBcHRQbHVnaW4uQVBUX05PTlJFQ09OQ0lMRV9DT01QSUxBVElPTl9QUk9CTEVNX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkpCi0JCXsKLQkJCXJlc3VsdC5hZGQobSk7Ci0JCX0KLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JOb0FwdE1hcmtlcnMoKQotICAgIHsKLSAgICAgICAgQXNzZXJ0aW9ucy53YWl0QXNzZXJ0KG5ldyBJV2FpdENvbmRpdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNoZWNrQ29uZGl0aW9uKCkgdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNYXJrZXJzKEFwdFBsdWdpbi5BUFRfTk9OUkVDT05DSUxFX0NPTVBJTEFUSU9OX1BST0JMRU1fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKS5sZW5ndGggPT0gMDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCAiQVBUIG1hcmtlcnMgZGlkIG5vdCBkaXNhcHBlYXIiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVMaXN0PEVPYmplY3Q+IGVsaXN0KGZpbmFsIEVPYmplY3QuLi4gZWxlbWVudHMpCi0gICAgewotICAgICAgICBmaW5hbCBFTGlzdDxFT2JqZWN0PiByZXN1bHQgPSBuZXcgQmFzaWNFTGlzdDxFT2JqZWN0PigpOwotICAgICAgICBmb3IgKEVPYmplY3QgZU9iaiA6IGVsZW1lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZml4QXB0RXJyb3JzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFubm90YXRpb25Xcml0ZXIgYW5uV3JpdGVyID0gQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIHNlaUluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3Ioc2VpVHlwZSk7Ci0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiBzZWlXc0Fubm90YXRpb24gPSBzZWlJbnNwZWN0b3IuaW5zcGVjdFR5cGUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7Ci0gICAgICAgIHNlaVdzQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5jbGVhcigpOwotICAgICAgICBhbm5Xcml0ZXIudXBkYXRlKHNlaVdzQW5ub3RhdGlvbik7Ci0KLSAgICAgICAgZmluYWwgSU1ldGhvZCBzZWlNZXRob2QgPSBzZWlUeXBlLmdldE1ldGhvZHMoKVswXTsKLSAgICAgICAgZmluYWwgSUFubm90YXRpb248SU1ldGhvZD4gc2VpV2ViTWV0aG9kQW5ub3RhdGlvbiA9IHNlaUluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKHNlaU1ldGhvZCwgImphdmF4Lmp3cy5XZWJNZXRob2QiKTsKLSAgICAgICAgYW5uV3JpdGVyLnJlbW92ZShzZWlXZWJNZXRob2RBbm5vdGF0aW9uKTsKLQotICAgICAgICBmaW5hbCBJVHlwZVBhcmFtZXRlciBzZWlNZXRob2RQYXJhbSA9IHNlaU1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKHNlaU1ldGhvZC5nZXRQYXJhbWV0ZXJOYW1lcygpWzBdKTsKLSAgICAgICAgZmluYWwgSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IHNlaVdlYlBhcmFtQW5ub3RhdGlvbiA9IHNlaUluc3BlY3Rvci5pbnNwZWN0UGFyYW0oc2VpTWV0aG9kUGFyYW0sICJqYXZheC5qd3MuV2ViUGFyYW0iKTsKLSAgICAgICAgYW5uV3JpdGVyLnJlbW92ZShzZWlXZWJQYXJhbUFubm90YXRpb24pOwotCi0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uSW5zcGVjdG9yIHdzSW1wbEluc3BlY3RvciA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3Iod3NJbXBsVHlwZSk7Ci0gICAgICAgIGZpbmFsIElBbm5vdGF0aW9uPElUeXBlPiB3c0ltcGxXc0Fubm90YXRpb24gPSB3c0ltcGxJbnNwZWN0b3IuaW5zcGVjdFR5cGUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7Ci0gICAgICAgIGZpbmFsIFNldDxJUGFyYW1WYWx1ZVBhaXI+IG5ld0FublZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsKLSAgICAgICAgZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFpciA6IHdzSW1wbFdzQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInNlcnZpY2VOYW1lIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3QW5uVmFsdWVzLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzZXJ2aWNlTmFtZSIsIEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJNeVNlcnZpY2VOYW1lIikpKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0FublZhbHVlcy5hZGQocGFpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd3NJbXBsV3NBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLmNsZWFyKCk7Ci0gICAgICAgIHdzSW1wbFdzQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5hZGRBbGwobmV3QW5uVmFsdWVzKTsKLSAgICAgICAgYW5uV3JpdGVyLnVwZGF0ZSh3c0ltcGxXc0Fubm90YXRpb24pOwotICAgICAgICB3YWl0Rm9yTm9BcHRNYXJrZXJzKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrTm9FcnJvcnNBZG9ybm1lbnQoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdzQ2hpbGRMaXN0LnByb3h5KCkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHNlaUNoaWxkTGlzdC5wcm94eSgpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3cykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYWRvcm5tZW50IiwgTk9fRVJST1IsIGRlY29yYXRvci5jb21wdXRlQWRvcm5tZW50RmxhZ3Moc2VpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhZG9ybm1lbnQiLCBOT19FUlJPUiwgZGVjb3JhdG9yLmNvbXB1dGVBZG9ybm1lbnRGbGFncyh3ZWJNZXRob2QpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFkb3JubWVudCIsIE5PX0VSUk9SLCBkZWNvcmF0b3IuY29tcHV0ZUFkb3JubWVudEZsYWdzKHdlYlBhcmFtKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvciBleHRlbmRzIFdlYlNlcnZpY2VQcm9ibGVtc0RlY29yYXRvcgotICAgIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcHV0ZUFkb3JubWVudEZsYWdzKE9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlQWRvcm5tZW50RmxhZ3Mob2JqKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vaW50ZWdyYXRpb24vdGVzdHMvbmF2aWdhdG9yL2FjdGlvbnMvV1NBY3Rpb25BYnN0cmFjdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTk4NDVjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL2ludGVncmF0aW9uL3Rlc3RzL25hdmlnYXRvci9hY3Rpb25zL1dTQWN0aW9uQWJzdHJhY3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLnRlc3RzLm5hdmlnYXRvci5hY3Rpb25zOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVBhdGg7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLmludGVncmF0aW9uLm5hdmlnYXRvci5ET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVNFSUNoaWxkTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5pbnRlZ3JhdGlvbi5uYXZpZ2F0b3IuSVdlYlNlcnZpY2VDaGlsZExpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20uaW50ZWdyYXRpb24ubmF2aWdhdG9yLmFjdGlvbnMuV1NBY3Rpb25Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JRE9NOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViU2VydmljZVByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5wZXJzaXN0ZW5jZS5KYXhXc1dvcmtzcGFjZVJlc291cmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5UZXN0UHJvamVjdHNVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuTmF2aWdhdG9yQ29udGVudFNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5leHRlbnNpb25zLkNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uVmlld2VyU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLk5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeTsNCi0NCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQ0KLXB1YmxpYyBjbGFzcyBXU0FjdGlvbkFic3RyYWN0VGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZSANCi17DQotCXByb3RlY3RlZCBzdGF0aWMgVGVzdFByb2plY3QgdGVzdFByajE7IA0KLQlwcm90ZWN0ZWQgc3RhdGljIFRlc3RQcm9qZWN0IHRlc3RQcmoyOyANCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqMzsNCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXN0UHJvamVjdCB0ZXN0UHJqNDsNCi0JDQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDE7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDI7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDM7DQotCXByaXZhdGUgSVdlYlNlcnZpY2VQcm9qZWN0IHdzUHJvamVjdDQ7DQotCQ0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMxOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMyOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmMzOw0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBtb2RlbFN5bmM0Ow0KLQkNCi0JcHJvdGVjdGVkIEpheFdzV29ya3NwYWNlUmVzb3VyY2UgdGFyZ2V0UmVzb3VyY2U7DQotCXByb3RlY3RlZCBET01BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeTsNCi0JDQotCXByb3RlY3RlZCBXU0FjdGlvblByb3ZpZGVyIHdzQWN0aW9uUHJvdiA9IG51bGw7DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmKHRlc3RQcmoxPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDEiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmoxID0gbmV3IFRlc3RQcm9qZWN0KGVqYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzEgPSB0ZXN0UHJqMS5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEiKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkxLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkxTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTF7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzSW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMS5jcmVhdGVUeXBlKG1vZGVsU3luYzEsICJTZWkyLmphdmEiLCAiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJTZWkyTmFtZVwiKSBwdWJsaWMgaW50ZXJmYWNlIFNlaTIgZXh0ZW5kcyBTZWkxIHtcbiIgKw0KLQkJCQkJIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJ3ZWJNZXRob2RcIikgcHVibGljIHZvaWQgdm9pZE1ldGhvZFdpdGhOb0FyZ3NOb3RJblBhcmVudCgpO1xuIiArDQotCQkJCQkifSIpOw0KLQkJCXRlc3RQcmoxLmNyZWF0ZVR5cGUobW9kZWxTeW5jMSwgIldTMS5qYXZhIiwgIkBqYXZheC5lamIuU3RhdGVsZXNzXG4iICsgIkBqYXZheC5qd3MuV2ViU2VydmljZShzZXJ2aWNlTmFtZT1cIldTMU5hbWVcIiwgZW5kcG9pbnRJbnRlcmZhY2U9XCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzEuU2VpMlwiKSBwdWJsaWMgY2xhc3MgV1MxIHt9Iik7DQotCQkJDQotCQl9DQotCQkNCi0JCWlmKHRlc3RQcmoyPT1udWxsKQ0KLQkJew0KLQkJCUlQcm9qZWN0IHdlYlByb2plY3QgPSBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVXZWIyNVByb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3QyIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMiA9IG5ldyBUZXN0UHJvamVjdCh3ZWJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajIuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMyID0gdGVzdFByajIuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMyIik7DQotCQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMS5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMU5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkxe1xuIiArDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCB2b2lkTWV0aG9kV2l0aE5vQXJnc0luUGFyZW50KCk7XG4iICsNCi0JCQkJCSJ9Iik7DQotCQkJdGVzdFByajIuY3JlYXRlVHlwZShtb2RlbFN5bmMyLCAiU2VpMi5qYXZhIiwgIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiU2VpMk5hbWVcIikgcHVibGljIGludGVyZmFjZSBTZWkyIGV4dGVuZHMgU2VpMSB7XG4iICsNCi0JCQkJCSJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHZvaWRNZXRob2RXaXRoTm9BcmdzTm90SW5QYXJlbnQoKTtcbiIgKw0KLQkJCQkJIn0iKTsNCi0JCQl0ZXN0UHJqMi5jcmVhdGVUeXBlKG1vZGVsU3luYzIsICJXUzEuamF2YSIsICJAamF2YXguandzLldlYlNlcnZpY2Uoc2VydmljZU5hbWU9XCJXUzFOYW1lXCIsIGVuZHBvaW50SW50ZXJmYWNlPVwib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMxLlNlaTJcIikgcHVibGljIGNsYXNzIFdTMSB7fSIpOw0KLQkJfQ0KLQkJDQotCQlpZih0ZXN0UHJqMz09bnVsbCkNCi0JCXsNCi0JCQlJUHJvamVjdCBlamJQcm9qZWN0ID0gVGVzdFByb2plY3RzVXRpbHMuY3JlYXRlRWpiM1Byb2plY3QoIkRPTVdTQWN0aW9uVGVzdFByb2plY3QzIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCQl0ZXN0UHJqMyA9IG5ldyBUZXN0UHJvamVjdChlamJQcm9qZWN0LmdldFByb2plY3QoKSk7DQotCQkJdGVzdFByajMuY3JlYXRlU291cmNlRm9sZGVyKCJzcmMiKTsNCi0JCQltb2RlbFN5bmMzID0gdGVzdFByajMuY3JlYXRlUGFja2FnZSgib3JnLmVjbGlwc2UudGVzdC5tb2RlbHN5bmMzIik7DQotCQkJdGVzdFByajMuY3JlYXRlVHlwZShtb2RlbFN5bmMzLA0KLQkJCQkJIldTMS5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMU5hbWVcIikgcHVibGljIGNsYXNzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwic3VwZXJQYXJlbnRNZXRob2RcIikgcHVibGljIHZvaWQgc3VwZXJQYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywNCi0JCQkJCSJXUzIuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTJOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzIgZXh0ZW5kcyBXUzEge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cInBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBwYXJlbnRNZXRob2QoKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJCQ0KLQkJCXRlc3RQcmozLmNyZWF0ZVR5cGUobW9kZWxTeW5jMywNCi0JCQkJCSJXUzMuamF2YSIsDQotCQkJCQkiQGphdmF4Lmp3cy5XZWJTZXJ2aWNlKG5hbWU9XCJJbXBsaWNpdFNlaTNOYW1lXCIpIHB1YmxpYyBjbGFzcyBXUzMgZXh0ZW5kcyBXUzIge1xuIg0KLQkJCQkJKyAiQGphdmF4Lmp3cy5XZWJNZXRob2Qob3BlcmF0aW9uTmFtZT1cIndlYk1ldGhvZFwiKSBwdWJsaWMgdm9pZCB3ZWJNZXRob2QoaW50IHBhcmFtKSB7fVxuIg0KLQkJCQkJKyAifSIpOw0KLQkJfQ0KLQ0KLQkJaWYodGVzdFByajQ9PW51bGwpDQotCQl7DQotCQkJSVByb2plY3Qgd2ViUHJvamVjdCA9IFRlc3RQcm9qZWN0c1V0aWxzLmNyZWF0ZVdlYjI1UHJvamVjdCgiRE9NV1NBY3Rpb25UZXN0UHJvamVjdDQiICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJCXRlc3RQcmo0ID0gbmV3IFRlc3RQcm9qZWN0KHdlYlByb2plY3QuZ2V0UHJvamVjdCgpKTsNCi0JCQl0ZXN0UHJqNC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQkJCW1vZGVsU3luYzQgPSB0ZXN0UHJqNC5jcmVhdGVQYWNrYWdlKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzQiKTsNCi0JCQl0ZXN0UHJqNC5jcmVhdGVUeXBlKG1vZGVsU3luYzQsDQotCQkJCQkiV1MxLmphdmEiLA0KLQkJCQkJIkBqYXZheC5qd3MuV2ViU2VydmljZShuYW1lPVwiSW1wbGljaXRTZWkxTmFtZVwiKSBwdWJsaWMgY2xhc3MgV1MxIHtcbiINCi0JCQkJCSsgIkBqYXZheC5qd3MuV2ViTWV0aG9kKG9wZXJhdGlvbk5hbWU9XCJzdXBlclBhcmVudE1ldGhvZFwiKSBwdWJsaWMgdm9pZCBzdXBlclBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajQuY3JlYXRlVHlwZShtb2RlbFN5bmM0LA0KLQkJCQkJIldTMi5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpMk5hbWVcIikgcHVibGljIGNsYXNzIFdTMiBleHRlbmRzIFdTMSB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwicGFyZW50TWV0aG9kXCIpIHB1YmxpYyB2b2lkIHBhcmVudE1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQkJDQotCQkJdGVzdFByajQuY3JlYXRlVHlwZShtb2RlbFN5bmM0LA0KLQkJCQkJIldTMy5qYXZhIiwNCi0JCQkJCSJAamF2YXguandzLldlYlNlcnZpY2UobmFtZT1cIkltcGxpY2l0U2VpM05hbWVcIikgcHVibGljIGNsYXNzIFdTMyBleHRlbmRzIFdTMiB7XG4iDQotCQkJCQkrICJAamF2YXguandzLldlYk1ldGhvZChvcGVyYXRpb25OYW1lPVwid2ViTWV0aG9kXCIpIHB1YmxpYyB2b2lkIHdlYk1ldGhvZCgpIHt9XG4iDQotCQkJCQkrICJ9Iik7DQotCQl9DQotDQotCQl0YXJnZXRSZXNvdXJjZSA9IG5ldyBKYXhXc1dvcmtzcGFjZVJlc291cmNlKEphdmFDb3JlLmNyZWF0ZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKSk7DQotCQl0YXJnZXRSZXNvdXJjZS5sb2FkKG51bGwpOw0KLQkJDQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajEuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDEgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajIuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDIgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDMgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJCWVsc2UgaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHModGVzdFByajQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpDQotCQkJew0KLQkJCQl0aGlzLndzUHJvamVjdDQgPSB3c1Byb2plY3Q7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0MSk7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0Mik7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0Myk7DQotCQlhc3NlcnROb3ROdWxsKHRoaXMud3NQcm9qZWN0NCk7DQotCQkNCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IERPTUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKCkgDQotCQl7DQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElXZWJTZXJ2aWNlUHJvamVjdCBnZXRXc1Byb2plY3QoZmluYWwgSURPTSBkb20sIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsNCi0JCQkJaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDEuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDE7DQotCQkJCX0NCi0JCQkJZWxzZSBpZihwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMod3NQcm9qZWN0Mi5nZXROYW1lKCkpKQ0KLQkJCQl7DQotCQkJCQlyZXR1cm4gd3NQcm9qZWN0MjsNCi0JCQkJfQ0KLQkJCQllbHNlIGlmKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh3c1Byb2plY3QzLmdldE5hbWUoKSkpDQotCQkJCXsNCi0JCQkJCXJldHVybiB3c1Byb2plY3QzOw0KLQkJCQl9DQotCQkJCWVsc2UgaWYocHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHdzUHJvamVjdDQuZ2V0TmFtZSgpKSkNCi0JCQkJew0KLQkJCQkJcmV0dXJuIHdzUHJvamVjdDQ7DQotCQkJCX0NCi0JCQkJdGhyb3cgbmV3IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcigicHJvamVjdCAiICsgcHJvamVjdCArICJub3QgZm91bmQgaW4gRE9NIik7DQotCQkJfQkJCQ0KLQkJfTsNCi0NCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJTZXJ2aWNlIGdldFdTRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViU2VydmljZSBnZXRXU0Zyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKElXZWJTZXJ2aWNlKXdTc1swXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSBnZXRTRUlFeHBGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJcmV0dXJuIChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbMF07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRnJvbVRlc3RQcmoxKFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgamo9MDsgamo8c0VJcy5sZW5ndGg7IGpqKyspDQotCQkJCXsNCi0JCQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2pqXSkuZ2V0TmFtZSgpLmVxdWFscyhzZWlOYW1lKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tqal07DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tVGVzdFByaihUZXN0UHJvamVjdCB0ZXN0UHJqLCBTdHJpbmcgd3NOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmouZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSB3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLQkJCQl7DQotCQkJCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKHdzTmFtZSkpDQotCQkJCQl7DQotCQkJCQkJcmV0dXJuIChJV2ViU2VydmljZSl3U3NbampdOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0vLwlwcm90ZWN0ZWQgSVdlYlNlcnZpY2UgZ2V0V1NGcm9tVGVzdFByajEoU3RyaW5nIHdzTmFtZSkNCi0vLwl7DQotLy8JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0vLwkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotLy8NCi0vLwkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotLy8JCXsNCi0vLwkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLS8vCQkJew0KLS8vCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotLy8JCQkJDQotLy8JCQkJZm9yKGludCBqaj0wOyBqajx3U3MubGVuZ3RoOyBqaisrKQ0KLS8vCQkJCXsNCi0vLwkJCQkJaWYoKChJV2ViU2VydmljZSl3U3NbampdKS5nZXROYW1lKCkuZXF1YWxzKHdzTmFtZSkpDQotLy8JCQkJCXsNCi0vLwkJCQkJCXJldHVybiAoSVdlYlNlcnZpY2Upd1NzW2pqXTsNCi0vLwkJCQkJfQ0KLS8vCQkJCX0NCi0vLwkJCX0NCi0vLwkJfQ0KLS8vCQkNCi0vLwkJcmV0dXJuIG51bGw7DQotLy8JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRnJvbVRlc3RQcmozKFN0cmluZyBzZWlOYW1lKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmozLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWZvcihpbnQgamo9MDsgamo8d1NzLmxlbmd0aDsgamorKykNCi0JCQkJew0KLQkJCQkJaWYoKChJV2ViU2VydmljZSl3U3NbampdKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKS5nZXROYW1lKCkuZXF1YWxzKHNlaU5hbWUpKQ0KLQkJCQkJew0KLQkJCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1tqal0pLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZ2V0U0VJRXhwRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoyLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlPYmplY3RbXSBzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzWzBdOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUltcEZyb21FamJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMy5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCU9iamVjdFtdIHdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlyZXR1cm4gKChJV2ViU2VydmljZSl3U3NbMF0pLmdldFNlcnZpY2VFbmRwb2ludCgpOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlIGdldFNFSUltcEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJDQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmo0LmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElXZWJTZXJ2aWNlQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJT2JqZWN0W10gd1NzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCXJldHVybiAoKElXZWJTZXJ2aWNlKXdTc1swXSkuZ2V0U2VydmljZUVuZHBvaW50KCk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMy5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInN1cGVyUGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajQuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jNC5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInN1cGVyUGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0V1NNZXRob2ROb3RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajMuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gd1NzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJV2ViU2VydmljZUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXdTcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod1NzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3U3MubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYlNlcnZpY2Upd1NzW2lpXSkuZ2V0SW1wbGVtZW50YXRpb24oKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3QubW9kZWxzeW5jMy5XUzMiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldFNlcnZpY2VFbmRwb2ludCgpKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFdTTWV0aG9kTm90SW5oZXJpdGVkRnJvbVdlYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmo0LmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHdTcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVdlYlNlcnZpY2VDaGlsZExpc3QpDQotCQkJew0KLQkJCQl3U3MgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdTcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d1NzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJTZXJ2aWNlKXdTc1tpaV0pLmdldEltcGxlbWVudGF0aW9uKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0Lm1vZGVsc3luYzQuV1MzIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJV2ViU2VydmljZSl3U3NbaWldKS5nZXRTZXJ2aWNlRW5kcG9pbnQoKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2RJbmhlcml0ZWRGcm9tRWpiUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajEuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoInBhcmVudE1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCBJV2ViTWV0aG9kIGdldFNFSU1ldGhvZEluaGVyaXRlZEZyb21XZWJQcm9qZWN0KCkNCi0Jew0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbih0ZXN0UHJqMi5nZXRQcm9qZWN0KCkpOw0KLQkJY2hpbGRyZW4gPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlblswXSk7DQotDQotCQlPYmplY3RbXSBzRUlzID0gbnVsbDsNCi0JCU9iamVjdFtdIHdlYk1ldGhvZHMgPSBudWxsOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPGNoaWxkcmVuLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZihjaGlsZHJlbltpaV0gaW5zdGFuY2VvZiBJU0VJQ2hpbGRMaXN0KQ0KLQkJCXsNCi0JCQkJc0VJcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuW2lpXSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwoc0VJcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8c0VJcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJTZWkyTmFtZSIpKQ0KLQkJCXsNCi0JCQkJd2ViTWV0aG9kcyA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkpOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdlYk1ldGhvZHMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHdlYk1ldGhvZHMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygicGFyZW50TWV0aG9kIikpDQotCQkJew0KLQkJCQlyZXR1cm4gKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV07DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElXZWJNZXRob2QgZ2V0U0VJTWV0aG9kTm90SW5oZXJpdGVkRnJvbUVqYlByb2plY3QoKQ0KLQl7DQotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKHRlc3RQcmoxLmdldFByb2plY3QoKSk7DQotCQljaGlsZHJlbiA9IGFkYXB0ZXJGYWN0b3J5LmdldENoaWxkcmVuKGNoaWxkcmVuWzBdKTsNCi0NCi0JCU9iamVjdFtdIHNFSXMgPSBudWxsOw0KLQkJT2JqZWN0W10gd2ViTWV0aG9kcyA9IG51bGw7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8Y2hpbGRyZW4ubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKGNoaWxkcmVuW2lpXSBpbnN0YW5jZW9mIElTRUlDaGlsZExpc3QpDQotCQkJew0KLQkJCQlzRUlzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5baWldKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzRUlzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxzRUlzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIlNlaTJOYW1lIikpDQotCQkJew0KLQkJCQl3ZWJNZXRob2RzID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oKChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKXNFSXNbaWldKSk7DQotCQkJCQ0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCQkNCi0JCWFzc2VydE5vdE51bGwod2ViTWV0aG9kcyk7DQotCQkNCi0JCWZvcihpbnQgaWk9MDsgaWk8d2ViTWV0aG9kcy5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoKChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldKS5nZXROYW1lKCkuZXF1YWxzKCJ3ZWJNZXRob2QiKSkNCi0JCQl7DQotCQkJCXJldHVybiAoSVdlYk1ldGhvZCl3ZWJNZXRob2RzW2lpXTsNCi0JCQl9DQotCQl9DQotCQkNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYk1ldGhvZCBnZXRTRUlNZXRob2ROb3RJbmhlcml0ZWRGcm9tV2ViUHJvamVjdCgpDQotCXsNCi0JCU9iamVjdFtdIGNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4odGVzdFByajIuZ2V0UHJvamVjdCgpKTsNCi0JCWNoaWxkcmVuID0gYWRhcHRlckZhY3RvcnkuZ2V0Q2hpbGRyZW4oY2hpbGRyZW5bMF0pOw0KLQ0KLQkJT2JqZWN0W10gc0VJcyA9IG51bGw7DQotCQlPYmplY3RbXSB3ZWJNZXRob2RzID0gbnVsbDsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTxjaGlsZHJlbi5sZW5ndGg7IGlpKyspDQotCQl7DQotCQkJaWYoY2hpbGRyZW5baWldIGluc3RhbmNlb2YgSVNFSUNoaWxkTGlzdCkNCi0JCQl7DQotCQkJCXNFSXMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbihjaGlsZHJlbltpaV0pOw0KLQkJCQkNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHNFSXMpOw0KLQkJDQotCQlmb3IoaW50IGlpPTA7IGlpPHNFSXMubGVuZ3RoOyBpaSsrKQ0KLQkJew0KLQkJCWlmKCgoSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZSlzRUlzW2lpXSkuZ2V0TmFtZSgpLmVxdWFscygiU2VpMk5hbWUiKSkNCi0JCQl7DQotCQkJCXdlYk1ldGhvZHMgPSBhZGFwdGVyRmFjdG9yeS5nZXRDaGlsZHJlbigoKElTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2Upc0VJc1tpaV0pKTsNCi0JCQkJDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbCh3ZWJNZXRob2RzKTsNCi0JCQ0KLQkJZm9yKGludCBpaT0wOyBpaTx3ZWJNZXRob2RzLmxlbmd0aDsgaWkrKykNCi0JCXsNCi0JCQlpZigoKElXZWJNZXRob2Qpd2ViTWV0aG9kc1tpaV0pLmdldE5hbWUoKS5lcXVhbHMoIndlYk1ldGhvZCIpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIChJV2ViTWV0aG9kKXdlYk1ldGhvZHNbaWldOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGluaXRXc0FjdGlvblByb3ZpZGVyV2l0aFRyZWVTZWxlY3Rpb24oT2JqZWN0W10gc2VsZWN0aW9uKQ0KLQl7DQotCQl3c0FjdGlvblByb3YgPSBuZXcgV1NBY3Rpb25Qcm92aWRlcigpOw0KLQkJDQotCQlNb2NrPFRyZWVWaWV3ZXI+IHRyZWVWaWV3ZXIgPSBtb2NrKFRyZWVWaWV3ZXIuY2xhc3MpOw0KLQkJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjQUV4dFNpdGUgPSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayh0cmVlVmlld2VyLnByb3h5KCkpOw0KLQ0KLQkJd3NBY3Rpb25Qcm92LmluaXQoY0FFeHRTaXRlKTsNCi0JCQ0KLQkJVHJlZVBhdGggcGF0aCA9IG5ldyBUcmVlUGF0aChzZWxlY3Rpb24pOw0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgVHJlZVNlbGVjdGlvbihwYXRoKTsNCi0JCUFjdGlvbkNvbnRleHQgYWN0Q250ID0gbmV3IEFjdGlvbkNvbnRleHQoc2VsKTsNCi0JCQ0KLQkJd3NBY3Rpb25Qcm92LnNldENvbnRleHQoYWN0Q250KTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFdzQWN0aW9uUHJvdmlkZXJXaXRoU3RydWN0dXJlZFNlbGVjdGlvbihPYmplY3RbXSBzZWxlY3Rpb24pDQotCXsNCi0JCXdzQWN0aW9uUHJvdiA9IG5ldyBXU0FjdGlvblByb3ZpZGVyKCk7DQotDQotCQlNb2NrPFRyZWVWaWV3ZXI+IHRyZWVWaWV3ZXIgPSBtb2NrKFRyZWVWaWV3ZXIuY2xhc3MpOw0KLQkJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBjQUV4dFNpdGUgPSBjcmVhdGVDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlTW9jayh0cmVlVmlld2VyLnByb3h5KCkpOw0KLQ0KLQkJd3NBY3Rpb25Qcm92LmluaXQoY0FFeHRTaXRlKTsNCi0JCQ0KLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24pOw0KLQkJQWN0aW9uQ29udGV4dCBhY3RDbnQgPSBuZXcgQWN0aW9uQ29udGV4dChzZWwpOw0KLQkJDQotCQl3c0FjdGlvblByb3Yuc2V0Q29udGV4dChhY3RDbnQpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSVdlYlNlcnZpY2VQcm9qZWN0IGdldFdzUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KQ0KLQl7DQotCQlJdGVyYXRvcjxJV2ViU2VydmljZVByb2plY3Q+IHdzUHJvamVjdHMgPSB0YXJnZXRSZXNvdXJjZS5nZXRET00oKS5nZXRXZWJTZXJ2aWNlUHJvamVjdHMoKS5pdGVyYXRvcigpOw0KLQkJDQotCQl3aGlsZSh3c1Byb2plY3RzLmhhc05leHQoKSkNCi0JCXsNCi0JCQlJV2ViU2VydmljZVByb2plY3Qgd3NQcm9qZWN0ID0gd3NQcm9qZWN0cy5uZXh0KCk7DQotCQkJDQotCQkJaWYod3NQcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHdzUHJvamVjdDsNCi0JCQl9DQotCQl9DQotCQl0aHJvdyBuZXcganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yKCJwcm9qZWN0ICIgKyBwcm9qZWN0ICsgIm5vdCBmb3VuZCBpbiBET00iKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIENvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgY3JlYXRlQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZU1vY2soZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpDQotCXsNCi0JCWZpbmFsIE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlIGNvbnRlbnRTZXJ2aWNlID0gKE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKU5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVDb250ZW50U2VydmljZSgibXl2aWV3ZXIiKTsNCi0JCQ0KLQkJLy9FY2xpcHNlIDMuNSBjb25zdHJ1Y3RvciByZXF1aXJlZCBmb3IgV1RQIGJ1aWxkDQotCQlyZXR1cm4gbmV3IENvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUoIm15ZXh0ZW5zaW9uaWQiLCAibXlwbHVnaW5pZCIsIChJQ29tbW9uVmlld2VyU2l0ZSltb2NrKElDb21tb25WaWV3ZXJTaXRlLmNsYXNzKS5wcm94eSgpLCBjb250ZW50U2VydmljZSwgdmlld2VyKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIElDb250cmlidXRpb25JdGVtIGNyZWF0ZUNvbnRyaWJ1dGlvbkl0ZW1Nb2NrKGZpbmFsIFN0cmluZyBpdGVtSWQpDQotCXsNCi0JCU1vY2s8SUNvbnRyaWJ1dGlvbkl0ZW0+IGNudHJiSXRlbSA9IG1vY2soSUNvbnRyaWJ1dGlvbkl0ZW0uY2xhc3MpOw0KLQkJY250cmJJdGVtLnN0dWJzKCkubWV0aG9kKCJnZXRJZCIpLndpbGwocmV0dXJuVmFsdWUoaXRlbUlkKSk7DQotCQljbnRyYkl0ZW0uc3R1YnMoKS5tZXRob2QoInNldFBhcmVudCIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJY250cmJJdGVtLnN0dWJzKCkubWV0aG9kKCJpc0R5bmFtaWMiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQlyZXR1cm4gY250cmJJdGVtLnByb3h5KCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGZpbGxNZW51V2l0aENvbnRyaWJ1dGlvbkl0ZW1zKGZpbmFsIE1lbnVNYW5hZ2VyIG1lbnUsIGZpbmFsIFN0cmluZy4uLiBpdGVtSWRzKQ0KLQl7DQotCQlmb3IoU3RyaW5nIGlkIDogaXRlbUlkcykNCi0JCXsNCi0JCQlJQ29udHJpYnV0aW9uSXRlbSBjbnRyYkl0ZW0gPSBjcmVhdGVDb250cmlidXRpb25JdGVtTW9jayhpZCk7DQotCQkJbWVudS5hZGQoY250cmJJdGVtKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJkMWE0MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTM0N2QxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZTA0ODRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0M2NiYzVmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjANCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wDQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMNCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4NCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyDQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41DQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aSwNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmptb2NrLA0KLSBvcmcuanVuaXQNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiN2FjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYzg4ZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UuLiA9IHNyYy8NCi1vdXRwdXQuLiA9IGJpbi8NCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXA0KLSAgICAgICAgICAgICAgIC4sXA0KLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGExNjhiNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotIw0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1CdW5kbGUtTmFtZS4wPURPTSBVSSBUZXN0cyAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5MmI0ZDg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbC5BbGxEb21JdGVtUHJvdmlkZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzLmludGVybmFsLkRPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdDsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQ0KLXsNCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkNCi0Jew0KLQkJZmluYWwgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFsbERvbUl0ZW1Qcm92aWRlclRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5jbGFzcyk7DQotCQkNCi0JCXJldHVybiBzdWl0ZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0FsbERvbUl0ZW1Qcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvQWxsRG9tSXRlbVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjM4Y2ViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvQWxsRG9tSXRlbVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS50ZXN0cy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvci5Qcm9wZXJ0eVZhbHVlV3JhcHBlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLklQcm9wZXJ0eVN0YXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuRG9tUGFja2FnZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYk1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5JV2ViUGFyYW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2VQcm9qZWN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLldlYlBhcmFtS2luZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5Eb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLklTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYk1ldGhvZEl0ZW1Qcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS51aS5JV2ViUGFyYW1JdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlNlcnZpY2VJdGVtUHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmptb2NrLk1vY2s7DQotDQotcHVibGljIGNsYXNzIEFsbERvbUl0ZW1Qcm92aWRlclRlc3QgZXh0ZW5kcyBNb2NrT2JqZWN0VGVzdENhc2UgDQotew0KLQlwcml2YXRlIERvbUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGl0ZW1Qcm92aWRlcjsgDQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlpdGVtUHJvdmlkZXIgPSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsNCi0JfQ0KLQkNCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkNCi0Jew0KLQkJaXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERPTUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCWl0ZW1Qcm92aWRlci5zZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShudWxsKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JCWl0ZW1Qcm92aWRlci5yZW1vdmVMaXN0ZW5lcihudWxsKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElKYXZhV2ViU2VydmljZUVsZW1lbnRJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJSmF2YVdlYlNlcnZpY2VFbGVtZW50SXRlbVByb3ZpZGVyIGphdmFJdGVtUHJvdmlkZXIgPSAoSUphdmFXZWJTZXJ2aWNlRWxlbWVudEl0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVyLmNyZWF0ZUlKYXZhV2ViU2VydmljZUVsZW1lbnRBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IGphdmFJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgamF2YVdTRWxlbSA9IG1vY2soSUphdmFXZWJTZXJ2aWNlRWxlbWVudC5jbGFzcyk7DQotCQlqYXZhV1NFbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoamF2YUl0ZW1Qcm92aWRlci5nZXRUZXh0KGphdmFXU0VsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0TnVsbChqYXZhSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElTZXJ2aWNlRW5kcG9pbnRJdGVtUHJvdmlkZXIoKQ0KLQl7DQotCQlJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIHNlaUl0ZW1Qcm92aWRlciA9IChJU2VydmljZUVuZHBvaW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZUFkYXB0ZXIoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBzZWlJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChwcm9wRGVzY3MpOw0KLQkJYXNzZXJ0VHJ1ZShwcm9wRGVzY3Muc2l6ZSgpID4gMCk7DQotCQkNCi0JCU1vY2sgc0VJRWxlbSA9IG1vY2soSVNlcnZpY2VFbmRwb2ludEludGVyZmFjZS5jbGFzcyk7DQotCQlzRUlFbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIuZ2V0VGV4dChzRUlFbGVtLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoc2VpSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuRmVhdHVyZXMobnVsbCkpOw0KLQkJYXNzZXJ0Tm90TnVsbChzZWlJdGVtUHJvdmlkZXIuZ2V0TmFtZUNhdGVnb3J5KCkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYk1ldGhvZEl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJNZXRob2RJdGVtUHJvdmlkZXIgbWV0aG9kSXRlbVByb3ZpZGVyID0gKElXZWJNZXRob2RJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IG1ldGhvZEl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3TUVsZW0gPSBtb2NrKElXZWJNZXRob2QuY2xhc3MpOw0KLQkJd01FbGVtLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJUZXN0TmFtZSIpKTsNCi0JCWFzc2VydE5vdE51bGwobWV0aG9kSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0VGV4dCh3TUVsZW0ucHJveHkoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhudWxsKSk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViU2VydmljZUl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyIHdzSXRlbVByb3ZpZGVyID0gKElXZWJTZXJ2aWNlSXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYlNlcnZpY2VBZGFwdGVyKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwod3NJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSB3c0l0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3c0VsZW0gPSBtb2NrKElXZWJTZXJ2aWNlLmNsYXNzKTsNCi0JCXdzRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyLmdldEltYWdlKG5ldyBPYmplY3QoKSkpOw0KLQkJYXNzZXJ0Tm90TnVsbCh3c0l0ZW1Qcm92aWRlci5nZXRUZXh0KHdzRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzSXRlbVByb3ZpZGVyLmdldE5hbWVDYXRlZ29yeSgpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlcigpDQotCXsNCi0JCUlXZWJTZXJ2aWNlUHJvamVjdEl0ZW1Qcm92aWRlciB3c1Byb2pJdGVtUHJvdmlkZXIgPSAoSVdlYlNlcnZpY2VQcm9qZWN0SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIuY3JlYXRlSVdlYlNlcnZpY2VQcm9qZWN0QWRhcHRlcigpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlcik7DQotCQkNCi0JCUxpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IHByb3BEZXNjcyA9IHdzUHJvakl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKHByb3BEZXNjcyk7DQotCQlhc3NlcnRUcnVlKHByb3BEZXNjcy5zaXplKCkgPiAwKTsNCi0JCQ0KLQkJTW9jayB3c1Byb2pFbGVtID0gbW9jayhJV2ViU2VydmljZVByb2plY3QuY2xhc3MpOw0KLQkJd3NQcm9qRWxlbS5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJnZXROYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiVGVzdE5hbWUiKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0JCWFzc2VydE5vdE51bGwod3NQcm9qSXRlbVByb3ZpZGVyLmdldFRleHQod3NQcm9qRWxlbS5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKHdzUHJvakl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG51bGwpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdElXZWJNZXRob2RJdGVtUHJvdmlkZXJHZXRJbXBsZW1lbnRhdGlvbigpDQotCXsNCi0JCUlXZWJNZXRob2RJdGVtUHJvdmlkZXIgbWV0aG9kSXRlbVByb3ZpZGVyID0gKElXZWJNZXRob2RJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlci5jcmVhdGVJV2ViTWV0aG9kQWRhcHRlcigpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RJdGVtUHJvdmlkZXIpOw0KLQkJDQotCQlNb2NrIHdlYlBhcmFtMSA9IG1vY2soSVdlYlBhcmFtLmNsYXNzKTsNCi0JCXdlYlBhcmFtMS5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIlBhcmFtMSIpKTsNCi0JCXdlYlBhcmFtMS5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0VHlwZU5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJib29sZWFuIikpOw0KLQkJTW9jayB3ZWJQYXJhbTIgPSBtb2NrKElXZWJQYXJhbS5jbGFzcyk7DQotCQl3ZWJQYXJhbTIuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldE5hbWUiKS53aWxsKHJldHVyblZhbHVlKCJyZXR1cm4iKSk7DQotCQl3ZWJQYXJhbTIuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiamF2YS5sYW5nLlN0cmluZyIpKTsNCi0JCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDxJV2ViUGFyYW0+IHdlYlBhcmFtcyA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDxJV2ViUGFyYW0+KCk7DQotCQl3ZWJQYXJhbXMuYWRkKChJV2ViUGFyYW0pd2ViUGFyYW0xLnByb3h5KCkpOw0KLQkJd2ViUGFyYW1zLmFkZCgoSVdlYlBhcmFtKXdlYlBhcmFtMi5wcm94eSgpKTsNCi0JCU1vY2sgd2ViTWV0aG9kID0gbW9jayhJV2ViTWV0aG9kLmNsYXNzKTsNCi0JCXdlYk1ldGhvZC5leHBlY3RzKGF0TGVhc3RPbmNlKCkpLm1ldGhvZCgiZ2V0UGFyYW1ldGVycyIpLndpbGwocmV0dXJuVmFsdWUod2ViUGFyYW1zKSk7DQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdE1ldGhvZChCKVFTdHJpbmciKSk7DQotCQkNCi0JCUJhc2ljRUxpc3Q8U3RhdGVBZGFwdGVyPiBhZGFwdGVycyA9IG5ldyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDxTdGF0ZUFkYXB0ZXI+KCk7DQotCQlNb2NrIGFkYXB0ZXIgPSBtb2NrKFN0YXRlQWRhcHRlci5jbGFzcyk7DQotCQlhZGFwdGVyLnN0dWJzKCkubWV0aG9kKCJpc0FkYXB0ZXJGb3JUeXBlIikud2lsbChyZXR1cm5WYWx1ZSh0cnVlKSk7DQotCQlhZGFwdGVyLnN0dWJzKCkubWV0aG9kKCJpc0NoYW5nZWFibGUiKS53aWxsKHJldHVyblZhbHVlKGZhbHNlKSk7DQotCQlhZGFwdGVycy5hZGQoKFN0YXRlQWRhcHRlcilhZGFwdGVyLnByb3h5KCkpOw0KLQkJDQotCQl3ZWJNZXRob2QuZXhwZWN0cyhhdExlYXN0T25jZSgpKS5tZXRob2QoImVBZGFwdGVycyIpLndpbGwocmV0dXJuVmFsdWUoYWRhcHRlcnMpKTsNCi0JCSgoSVdlYk1ldGhvZCl3ZWJNZXRob2QucHJveHkoKSkuZUFkYXB0ZXJzKCk7DQotCQltZXRob2RJdGVtUHJvdmlkZXIuc2V0VGFyZ2V0KChOb3RpZmllcil3ZWJNZXRob2QucHJveHkoKSk7DQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBwcm9wRGVzY3MgPSBtZXRob2RJdGVtUHJvdmlkZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyh3ZWJNZXRob2QucHJveHkoKSk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwocHJvcERlc2NzKTsNCi0JCWFzc2VydFRydWUocHJvcERlc2NzLnNpemUoKSA+IDApOw0KLQkJDQotCQlmb3IoSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgcHJvcERlc2MgOiBwcm9wRGVzY3MpDQotCQl7DQotCQkJaWYocHJvcERlc2MuZ2V0RmVhdHVyZShudWxsKS5lcXVhbHMoRG9tUGFja2FnZS5MaXRlcmFscy5JSkFWQV9XRUJfU0VSVklDRV9FTEVNRU5UX19JTVBMRU1FTlRBVElPTikpDQotCQkJew0KLQkJCQlhc3NlcnRFcXVhbHMoKChQcm9wZXJ0eVZhbHVlV3JhcHBlcilwcm9wRGVzYy5nZXRQcm9wZXJ0eVZhbHVlKHdlYk1ldGhvZC5wcm94eSgpKSkuZ2V0VGV4dChudWxsKSwgIlN0cmluZyB0ZXN0TWV0aG9kKGJvb2xlYW4pIik7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SVdlYlBhcmFtSXRlbVByb3ZpZGVyKCkNCi0Jew0KLQkJSVdlYlBhcmFtSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJV2ViUGFyYW1JdGVtUHJvdmlkZXIpIG5ldyBEb21JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLmNyZWF0ZUlXZWJQYXJhbUFkYXB0ZXIoKTsNCi0JCU1vY2sgcGFyYW1Nb2NrID0gbW9jayhJV2ViUGFyYW0uY2xhc3MpOwkJDQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXRJbWFnZShuZXcgT2JqZWN0KCkpKTsNCi0NCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZ2V0TmFtZSIpLndpbGwocmV0dXJuVmFsdWUoIm15UGFyYW0iKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldFR5cGVOYW1lIikud2lsbChyZXR1cm5WYWx1ZSgiamF2YS51dGlsLkxpc3QiKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgidGVzdCIpKTsNCi0JCXBhcmFtTW9jay5zdHVicygpLm1ldGhvZCgiZUNvbnRhaW5lciIpLndpbGwocmV0dXJuVmFsdWUobnVsbCkpOw0KLQkJcGFyYW1Nb2NrLnN0dWJzKCkubWV0aG9kKCJlUmVzb3VyY2UiKS53aWxsKHJldHVyblZhbHVlKG51bGwpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKCJteVBhcmFtIiwgaXRlbVByb3ZpZGVyLmdldFRleHQocGFyYW1Nb2NrLnByb3h5KCkpKTsNCi0JCWFzc2VydE5vdE51bGwoaXRlbVByb3ZpZGVyLmdldEltYWdlKHBhcmFtTW9jay5wcm94eSgpKSk7DQotCQlhc3NlcnROb3ROdWxsKGl0ZW1Qcm92aWRlci5nZXROYW1lQ2F0ZWdvcnkoKSk7DQotCQlwYXJhbU1vY2suc3R1YnMoKS5tZXRob2QoImdldEltcGxlbWVudGF0aW9uIikud2lsbChyZXR1cm5WYWx1ZSgicmV0dXJuIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChpdGVtUHJvdmlkZXIuZ2V0SW1hZ2UocGFyYW1Nb2NrLnByb3h5KCkpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJV2ViUGFyYW1JdGVtUHJvdmlkZXJGb3JUeXBlTmFtZSgpDQotCXsNCi0JCS8vIElXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlmaW5hbCBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciB0eXBlTmFtZVByb3BlcnR5RGVzY3JpcHRvciA9IGZpbmRXZWJQYXJhbUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUpOw0KLQkJDQotCQlmaW5hbCBJV2ViUGFyYW0gd2ViUGFyYW0gPSBEb21GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJV2ViUGFyYW0oKTsNCi0JCXdlYlBhcmFtLnNldEhlYWRlcih0cnVlKTsNCi0JCXdlYlBhcmFtLnNldEtpbmQoV2ViUGFyYW1LaW5kLklOT1VUKTsNCi0JCXdlYlBhcmFtLnNldE5hbWUoImFueU5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJd2ViUGFyYW0uc2V0UGFydE5hbWUoImFueVBhcnROYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCXdlYlBhcmFtLnNldFRhcmdldE5hbWVzcGFjZSgiYW55VGFyZ2V0TmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCSgoRU9iamVjdCkgd2ViUGFyYW0pLmVTZXQoRG9tUGFja2FnZS5MaXRlcmFscy5JV0VCX1BBUkFNX19UWVBFX05BTUUsIG51bGwpOw0KLQkJCQkNCi0JCWFzc2VydE51bGwoIlVuZXhwZWN0ZWQgdmFsdWUuIiwgdHlwZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3IuZ2V0UHJvcGVydHlWYWx1ZSh3ZWJQYXJhbSkpOyAvLyROT04tTkxTLTEkDQotDQotCQlPYmplY3QgcHJvcGVydHlWYWx1ZVdyYXBwZXIgPSBudWxsOw0KLQkJDQotCQkoKEVPYmplY3QpIHdlYlBhcmFtKS5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSVdFQl9QQVJBTV9fVFlQRV9OQU1FLCAiSSIpOyAvLyROT04tTkxTLTEkDQotCQlwcm9wZXJ0eVZhbHVlV3JhcHBlciA9IHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pOwkJDQotCQlhc3NlcnRFcXVhbHMoIlVucmVzb2x2ZWQgdmFsdWUuIiwgImludCIsICgoSUl0ZW1Qcm9wZXJ0eVNvdXJjZSkgcHJvcGVydHlWYWx1ZVdyYXBwZXIpLmdldEVkaXRhYmxlVmFsdWUobnVsbCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQ0KLQkJKChFT2JqZWN0KSB3ZWJQYXJhbSkuZVNldChEb21QYWNrYWdlLkxpdGVyYWxzLklXRUJfUEFSQU1fX1RZUEVfTkFNRSwgIltRU3RyaW5nOyIpOyAvLyROT04tTkxTLTEkDQotCQlwcm9wZXJ0eVZhbHVlV3JhcHBlciA9IHR5cGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yLmdldFByb3BlcnR5VmFsdWUod2ViUGFyYW0pOwkJDQotCQlhc3NlcnRFcXVhbHMoIlVucmVzb2x2ZWQgdmFsdWUuIiwgIlN0cmluZ1tdIiwgKChJSXRlbVByb3BlcnR5U291cmNlKSBwcm9wZXJ0eVZhbHVlV3JhcHBlcikuZ2V0RWRpdGFibGVWYWx1ZShudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotCQ0KLQlwcml2YXRlIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGZpbmRXZWJQYXJhbUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoZmluYWwgRUF0dHJpYnV0ZSBhdHRyaWJ1dGUpDQotCXsNCi0JCWZpbmFsIElXZWJQYXJhbUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVdlYlBhcmFtSXRlbVByb3ZpZGVyKSBuZXcgRG9tSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKS5jcmVhdGVJV2ViUGFyYW1BZGFwdGVyKCk7DQotCQlMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IGl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG51bGwpOw0KLQkJCQkJDQotCQlmb3IgKElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykJCQkNCi0JCXsNCi0JCQlpZiAoZGVzY3JpcHRvci5nZXRGZWF0dXJlKG51bGwpLmVxdWFscyhhdHRyaWJ1dGUpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIGRlc2NyaXB0b3I7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVBZGFwdGVyIGV4dGVuZHMgSVByb3BlcnR5U3RhdGUsIEFkYXB0ZXINCi0Jew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvZG9tL3VpL3Rlc3RzL2ludGVybmFsL0RPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZmJmY2RkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy9kb20vdWkvdGVzdHMvaW50ZXJuYWwvRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkudGVzdHMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLmRvbS5ydW50aW1lLmFwaS5Eb21GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MuZG9tLnJ1bnRpbWUuYXBpLkRvbVBhY2thZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20ucnVudGltZS5hcGkuSVdlYlNlcnZpY2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy5kb20udWkuaW50ZXJuYWwuaW1wbC5ET01JdGVtUHJvcGVydHlQcm92aWRlcjsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyfSBjbGFzcw0KLSAqIEBhdXRob3IgR2VvcmdpIFZhY2hrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRE9NSXRlbVByb3BlcnR5UHJvdmlkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgDQotew0KLQlwcml2YXRlIERPTUl0ZW1Qcm9wZXJ0eVByb3ZpZGVyIHByb3ZpZGVyOw0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXAoKQ0KLQl7DQotCQlwcm92aWRlciA9IG5ldyBET01JdGVtUHJvcGVydHlQcm92aWRlcigNCi0JCQkJbnVsbCwNCi0JCQkJbnVsbCwNCi0JCQkJImRpc3BsYXkgbmFtZSIsDQotCQkJCSJkZXNjcmlwdGlvbiIsDQotCQkJCURvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fTkFNRSwNCi0JCQkJdHJ1ZSwNCi0JCQkJZmFsc2UsDQotCQkJCWZhbHNlLA0KLQkJCQludWxsLCANCi0JCQkJImNhdGVnb3J5IiwNCi0JCQkJbmV3IFN0cmluZ1swXSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RSZXNldFByb3BlcnR5VmFsdWUoKQ0KLQl7DQotCQlmaW5hbCBJV2ViU2VydmljZSB3cyA9IERvbUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUlXZWJTZXJ2aWNlKCk7DQotCQl3cy5lU2V0KERvbVBhY2thZ2UuTGl0ZXJhbHMuSUpBVkFfV0VCX1NFUlZJQ0VfRUxFTUVOVF9fSU1QTEVNRU5UQVRJT04sICJvcmcuZWNsaXBzZS50ZXN0LlNlaSIpOw0KLQkJd3Muc2V0TmFtZSgiVGVzdCIpOw0KLQkJcHJvdmlkZXIucmVzZXRQcm9wZXJ0eVZhbHVlKHdzKTsNCi0JCWFzc2VydEVxdWFscygiU2VpU2VydmljZSIsIHdzLmdldE5hbWUoKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyZDFhNDMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY3YTM4MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKdWwgMjAgMTU6MjU6MzEgRUVTVCAyMDA5DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjg2MTAxOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wDQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMg0KLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMA0KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzDQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luDQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcg0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuam1vY2ssDQotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLA0KLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsDQotIG9yZy5lY2xpcHNlLmpkdC5jb3JlLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZywNCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscywNCi0gb3JnLmp1bml0LA0KLSBvcmcuZWNsaXBzZS5qZHQuYXB0LmNvcmUNCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmZpbGVzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlcywNCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qb2JzLA0KLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QsDQotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nDQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5BdWd1c3QgMjAsIDIwMDk8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODhlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXNvdXJjZS4uID0gc3JjLw0KLW91dHB1dC4uID0gYmluLw0KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcDQotICAgICAgICAgICAgICAgLixcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMNCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTgzMDM5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0jDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLQ0KLUJ1bmRsZS1OYW1lLjA9VXRpbGl0aWVzIGZvciBKVW5pdCB0ZXN0cyAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL0lXYWl0Q29uZGl0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL0lXYWl0Q29uZGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRhMDhlOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9JV2FpdENvbmRpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnMuQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb247DQotDQotLyoqDQotICogSW50ZXJmYWNlIHdoaWNoIGRlZmluZXMgYSBjb25kaXRpb24gdXBvbiB3aGljaCB0aGUgZXhlY3V0aW9uIGNhbiBjb250aW51ZSANCi0gKiBAYXV0aG9yIERhbmFpbCBCcmFuZWtvdg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVdhaXRDb25kaXRpb24NCi17DQotCS8qKg0KLQkgKiBNZXRob2Qgd2hpY2ggY2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBjb25kaXRpb24gaXMgbWV0DQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW4gY2FzZSB0aGUgY29uZGl0aW9uIGlzIG1ldCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAdGhyb3dzIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uIHdoZW4gaW1wbGVtZW50b3JzIGRlY2lkZSB0aGF0IHRoZXkgY2Fubm90IGRlYWwgd2l0aCBhIGdpdmVuIGV4Y2VwdGlvbmFsIHNpdHVhdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDb25kaXRpb24oKSB0aHJvd3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb247DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25zLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQXNzZXJ0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZmI5ZmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmFzc2VydGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuSVdhaXRDb25kaXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nLlRlc3RDb250ZXh0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KLQ0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgbWV0aG9kcyB3aGljaCBhc3NlcnQgdGhhdCBhIGdpdmVuIGNvbmRpdGlvbiBpcyBtZXQuIElmIG5lY2Vzc2FyeSwgbWV0aG9kcyB3aWxsIGJsb2NrIHRoZSBleGVjdXRpb24gb2YgdGhlIGNhbGxlciB1bnRpbA0KLSAqIHRoZSBjb25kaXRpb24gaXMgbWV0IGZvciBhIHJlYXNvbmFibGUgdGltZS4gSWYgdGhlIGNvbmRpdGlvbnMgaXMgbm90IG1ldCwgPGNvZGU+QXNzZXJ0LmZhaWwoKTwvY29kZT4gaXMgaW52b2tlZA0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIEFzc2VydGlvbnMNCi17DQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfQ09ORElUSU9OX0NIRUNLUyA9IDUwMDA7DQotDQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBTTEVFUF9USU1FT1VUID0gNDI7DQotDQotCS8qKg0KLQkgKiBBc3NlcnRzIHRoYXQgd2FpdHMgc29tZSB0aW1lIHVudGlsIHRoZSBjb25kaXRpb24gc3BlY2lmaWVkIGlzIG1ldC4gSWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0IGFmdGVyIHNvbWUgcmVhc29uYWJsZSB0aW1lLCB0aGUgbWV0aG9kIGNhbGxzIEFzc2VydC5mYWlsKCkgIA0KLQkgKiBAcGFyYW0gY29uZGl0aW9uIHRoZSBjb25kaXRpb24gdG8gY2hlY2sNCi0JICogQHBhcmFtIGZhaWxNZXNzYWdlIHRoZSBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIDxjb2RlPkFzc2VydC5mYWlsKCk8L2NvZGU+IHRodXMgaW5kaWNhdGluZyBhIHRlc3QgZmFpbHVyZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRBc3NlcnQoZmluYWwgSVdhaXRDb25kaXRpb24gY29uZGl0aW9uLCBmaW5hbCBTdHJpbmcgZmFpbE1lc3NhZ2UpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCWlmICghd2FpdEZvckNvbmRpdGlvbkxvb3AoY29uZGl0aW9uKSkNCi0JCQl7DQotCQkJCUFzc2VydC5mYWlsKGZhaWxNZXNzYWdlKTsNCi0JCQl9DQotCQl9IGNhdGNoIChDb25kaXRpb25DaGVja0V4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWZhaWxVcG9uVGhyb3dhYmxlKGUpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBCbG9ja3MgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2FsbGVyIHVudGlsIHRoZSA8Y29kZT5jb25kaXRpb248L2NvZGU+IGlzIG1ldCBvciBNQVhfQ09ORElUSU9OX0NIRUNLUyBhdHRlbXB0cyBoYXZlIGJlZW4gcmVhY2hlZC48YnI+DQotCSAqIFRoZSBtZXRob2QgYmVoYXZpb3VyIHNsaWdodGx5IGRlcGVuZHMgb24gd2hldGhlciB0aGUgbWV0aG9kIGlzIGludm9rZWQgZnJvbSB0aGUgVUkgdGhyZWFkIG9yIG5vdA0KLQkgKiA8bGk+SWYgdGhlIGNhbGxlciBpcyB0aGUgVUkgdGhyZWFkLCBhIG5ldyBtb2RhbCBjb250ZXh0IHRocmVhZCBpcyBzdGFydGVkIHdoaWNoIHNsZWVwcyBmb3Ige0BsaW5rICNTTEVFUF9USU1FT1VUfQ0KLQkgKiA8bGk+SWYgdGhlIGNhbGxlciBpcyBub3QgdGhlIFVJIHRocmVhZCwgdGhlbiB0aGUgY3VycmVudCB0aHJlYWQgc2xlZXBzIGZvciB7QGxpbmsgI1NMRUVQX1RJTUVPVVR9IDxicj4NCi0JICogDQotCSAqIEBwYXJhbSBjb25kaXRpb24NCi0JICogICAgICAgICAgICBjb25kaXRpb24gb24gd2hpY2ggdGhlIG1ldGhvZCB3aWxsIHJldHVybiBpZiBtZXQNCi0JICogQHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB3YWl0Rm9yQ29uZGl0aW9uTG9vcChmaW5hbCBJV2FpdENvbmRpdGlvbiBjb25kaXRpb24pIHRocm93cyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbg0KLQl7DQotCQlpbnQgYXR0ZW1wdHMgPSAwOw0KLQkJd2hpbGUgKGF0dGVtcHRzIDwgTUFYX0NPTkRJVElPTl9DSEVDS1MpDQotCQl7DQotCQkJaWYgKGNvbmRpdGlvbi5jaGVja0NvbmRpdGlvbigpKQ0KLQkJCXsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQ0KLQkJCWF0dGVtcHRzKys7DQotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHNsZWVwUnVubmFibGUgPSBnZXRTbGVlcFJ1bm5hYmxlKCk7DQotDQotCQkJdHJ5DQotCQkJew0KLQkJCQlUZXN0Q29udGV4dC5ydW4oc2xlZXBSdW5uYWJsZSwgRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOw0KLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkNCi0JCQl7DQotCQkJCXRocm93IG5ldyBDb25kaXRpb25DaGVja0V4Y2VwdGlvbihlKTsNCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQ0KLQkJCXsNCi0JCQkJdGhyb3cgbmV3IENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGUpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHN0YXRpYyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgZ2V0U2xlZXBSdW5uYWJsZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkNCi0JCXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0JCQl7DQotCQkJCVRocmVhZC5zbGVlcChTTEVFUF9USU1FT1VUKTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgZmFpbFVwb25UaHJvd2FibGUoZmluYWwgVGhyb3dhYmxlIHQpDQotCXsNCi0JCWZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHQuZ2V0TWVzc2FnZSgpKTsNCi0JCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7DQotCQlQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOw0KLQkJdC5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOw0KLQkJbXNnQnVpbGRlci5hcHBlbmQoc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOw0KLQkJbXNnQnVpbGRlci5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsNCi0NCi0JCUFzc2VydC5mYWlsKG1zZ0J1aWxkZXIudG9TdHJpbmcoKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9hc3NlcnRpb25zL0NvbmRpdGlvbkNoZWNrRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWU2OTFkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2Fzc2VydGlvbnMvQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5hc3NlcnRpb25zOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLklXYWl0Q29uZGl0aW9uOw0KLQ0KLQ0KLS8qKg0KLSAqIEV4Y2VwdGlvbiB3aGljaCBjYW4gYmUgdGhyb3duIGJ5IHtAbGluayBJV2FpdENvbmRpdGlvbiNjaGVja0NvbmRpdGlvbigpfSBtZXRob2QuIFRoaXMgaXMgYSB3cmFwcGVyIGV4Y2VwdGlvbiB3aGljaCBlbmNsb3NlcyB0aGUgZXhjZXB0aW9uIGNhdXNlDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24NCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00OTI5MDgwMjg1NTA2Nzg4OTg0TDsNCi0NCi0JcHVibGljIENvbmRpdGlvbkNoZWNrRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkNCi0Jew0KLQkJc3VwZXIoY2F1c2UpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29uZGl0aW9uQ2hlY2tFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpDQotCXsNCi0JCXN1cGVyKG1lc3NhZ2UpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvZmlsZXMvVGVzdEZpbGVVdGlscy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9UZXN0RmlsZVV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM1MzJjYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9UZXN0RmlsZVV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmZpbGVzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOw0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5Ow0KLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcElucHV0U3RyZWFtOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RmlsZVV0aWxzDQotew0KLQkvLyBIaWRlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JcHJpdmF0ZSBUZXN0RmlsZVV0aWxzKCkNCi0Jew0KLQl9Ow0KLQ0KLQkvKiogR2V0IG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsZVV0aWxpdGllcyBvYmplY3QgKi8NCi0JcHVibGljIHN0YXRpYyBUZXN0RmlsZVV0aWxzIGdldEluc3RhbmNlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBUZXN0RmlsZVV0aWxzKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFV0aWxpdHkgbWV0aG9kLiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgZm9sZGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjb3B5RmlsZXMoZmluYWwgRmlsZSBkZXN0LCBmaW5hbCBGaWxlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0NCi0JCWlmIChzcmMuaXNEaXJlY3RvcnkoKSkNCi0JCXsNCi0JCQlkZXN0Lm1rZGlycygpOw0KLQkJCWZpbmFsIFN0cmluZyBsaXN0W10gPSBzcmMubGlzdCgpOw0KLQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykNCi0JCQl7DQotCQkJCWZpbmFsIFN0cmluZyBkZXN0MSA9IGRlc3QuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXFwiICsgbGlzdFtpXTsNCi0JCQkJZmluYWwgU3RyaW5nIHNyYzEgPSBzcmMuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXFwiICsgbGlzdFtpXTsNCi0JCQkJY29weUZpbGVzKG5ldyBGaWxlKGRlc3QxKSwgbmV3IEZpbGUoc3JjMSkpOw0KLQkJCX0NCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXJldHVybiBjb3B5KGRlc3QsIHNyYyk7DQotCQl9DQotDQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFV0aWxpdHkgbWV0aG9kIGZvciBjb3B5aW5nIGEgZmlsZSEgLSBub3QgYSBkaXJlY3RvcnkNCi0JICogDQotCSAqIEBwYXJhbSB0YXJnZXQNCi0JICogQHBhcmFtIHNvdXJjZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjb3B5KGZpbmFsIEZpbGUgdGFyZ2V0LCBmaW5hbCBGaWxlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWlmICghc291cmNlLmlzRmlsZSgpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCWZpbmFsIEZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSkuZ2V0Q2hhbm5lbCgpOw0KLQkJZmluYWwgRmlsZUNoYW5uZWwgdGFyZ2V0Q2hhbm5lbCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGFyZ2V0KS5nZXRDaGFubmVsKCk7DQotCQlzb3VyY2VDaGFubmVsLnRyYW5zZmVyVG8oMCwgc291cmNlQ2hhbm5lbC5zaXplKCksIHRhcmdldENoYW5uZWwpOw0KLQkJc291cmNlQ2hhbm5lbC5jbG9zZSgpOw0KLQkJdGFyZ2V0Q2hhbm5lbC5jbG9zZSgpOw0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKiBAcGFyYW0gZGVzdERpcg0KLQkgKiBAcGFyYW0gc3JjUmVsYXRpdmVQYXRoIC0NCi0JICogICAgICAgICAgICB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgaW4gdGhlIHNhbWUgcGFja2FnZQ0KLQkgKiBAcGFyYW0gcmVzb3VyY2VOYW1lDQotCSAqIEBwYXJhbSByZXNvdXJjZUNsYXNzDQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIEZpbGUgY29weVJlc291cmNlVG9EaXIoRmlsZSBkZXN0RGlyLCBJbnB1dFN0cmVhbSBzcmNTdHJlYW0sIFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgcmVzb3VyY2VOYW1lKTsNCi0JCWNvcHlGaWxlKHNyY1N0cmVhbSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpKTsNCi0JCXJldHVybiBkZXN0RmlsZTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqIEBwYXJhbSBkZXN0RGlyDQotCSAqIEBwYXJhbSBzcmNSZWxhdGl2ZVBhdGggLQ0KLQkgKiAgICAgICAgICAgIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBpbiB0aGUgc2FtZSBwYWNrYWdlDQotCSAqIEBwYXJhbSBzcmNGaWxlTmFtZQ0KLQkgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcw0KLQkgKiBAcmV0dXJuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBGaWxlIGNvcHlSZXNvdXJjZVRvRGlyKEZpbGUgZGVzdERpciwgU3RyaW5nIHNyY1JlbGF0aXZlUGF0aCwgU3RyaW5nIHNyY0ZpbGVOYW1lLCBDbGFzczw/PiByZXNvdXJjZUNsYXNzKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHNyY0ZpbGVOYW1lKTsNCi0JCWNvcHlGaWxlKGNyZWF0ZUlucHV0U3RyZWFtRm9yUmVzb3VyY2Uoc3JjUmVsYXRpdmVQYXRoLCBzcmNGaWxlTmFtZSwgcmVzb3VyY2VDbGFzcyksIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7DQotCQlyZXR1cm4gZGVzdEZpbGU7DQotCX0NCi0NCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbUZvclJlc291cmNlKFN0cmluZyBzcmNSZWxhdGl2ZVBhdGgsIFN0cmluZyBzcmNGaWxlTmFtZSwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykNCi0Jew0KLQkJcmV0dXJuIHJlc291cmNlQ2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShjcmVhdGVSZXNvdXJjZVBhdGgoc3JjUmVsYXRpdmVQYXRoKSArIHNyY0ZpbGVOYW1lKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVSZXNvdXJjZVBhdGgoU3RyaW5nIHNyY1JlbGF0aXZlUGF0aCkNCi0Jew0KLQkJcmV0dXJuIChzcmNSZWxhdGl2ZVBhdGggPT0gbnVsbCkgPyAiIiA6IHNyY1JlbGF0aXZlUGF0aCArICIvIjsNCi0JfQ0KLQ0KLQkvKiogQ2xvc2VzIHRoZSBzdHJlYW1zIGFmdGVyIGNvbXBsZXRpb24gKi8NCi0JcHVibGljIHZvaWQgY29weUZpbGUoSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlpZiAoaW4gPT0gbnVsbCB8fCBvdXQgPT0gbnVsbCkNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJlYW0gbm90IGluaXRpYWxpemVkIik7DQotCQl0cnkNCi0JCXsNCi0JCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07DQotCQkJaW50IGxlbjsNCi0JCQl3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmKSkgPiAwKQ0KLQkJCXsNCi0JCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlpbi5jbG9zZSgpOw0KLQkJCW91dC5jbG9zZSgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBVdGlsaXR5IG1ldGhvZCBmb3IgZGVsZXRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZm9sZGVyIHBhdGgNCi0JICogDQotCSAqIEBwYXJhbSBmb2xkZXJQYXRoDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2Nlc3Mgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZUZvbGRlckFuZENvbnRlbnRzKGZpbmFsIFN0cmluZyBmb2xkZXJQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgRmlsZSBwYXRoID0gbmV3IEZpbGUoZm9sZGVyUGF0aCk7DQotCQlyZXR1cm4gZGVsZXRlRm9sZGVyQW5kQ29udGVudHMocGF0aCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMgaW5jbHVkaW5nIGFsbCBzdWIgZGlyZWN0b3JpZXMuDQotCSAqIA0KLQkgKiBAcGFyYW0gdGVtcERpcg0KLQkgKiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgdGhhdCBpcyBiZWluZyBkZWxldGVkLg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlRm9sZGVyQW5kQ29udGVudHMoRmlsZSB0ZW1wRGlyKQ0KLQl7DQotCQlib29sZWFuIHN0YXR1cyA9IHRydWU7DQotCQlpZiAodGVtcERpciAhPSBudWxsKQ0KLQkJew0KLQkJCUZpbGVbXSBmaWxlcyA9IHRlbXBEaXIubGlzdEZpbGVzKCk7DQotDQotCQkJaWYgKGZpbGVzICE9IG51bGwpDQotCQkJew0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQ0KLQkJCQl7DQotCQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXsNCi0JCQkJCQlzdGF0dXMgPSBkZWxldGVGb2xkZXJBbmRDb250ZW50cyhmaWxlc1tpXSkgJiYgc3RhdHVzOw0KLQkJCQkJfSBlbHNlDQotCQkJCQl7DQotCQkJCQkJc3RhdHVzID0gZmlsZXNbaV0uZGVsZXRlKCkgJiYgc3RhdHVzOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCXN0YXR1cyA9IHRlbXBEaXIuZGVsZXRlKCkgJiYgc3RhdHVzOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJc3RhdHVzID0gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gc3RhdHVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBFeHRyYWN0cyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBmaWxlIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaXN0cg0KLQkgKiAgICAgICAgICAgIFRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIGphciBmaWxlDQotCSAqIEBwYXJhbSBzcmNGaWxlTmFtZQ0KLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIC0gd2hlcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBzdHJlYW0gd2lsbCBiZSBjb3BpZWQNCi0JICogQHBhcmFtIGRlc3REaXINCi0JICogICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9iamVjdA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5DQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBib29sZWFuIHVuemlwQXJjaGl2ZVRvRGlyKGZpbmFsIElucHV0U3RyZWFtIGlzdHIsIGZpbmFsIFN0cmluZyBzcmNGaWxlTmFtZSwgZmluYWwgRmlsZSBkZXN0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQ0KLQkJaWYgKCFkZXN0RGlyLmV4aXN0cygpKQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0Iik7DQotCQlpZiAoIWRlc3REaXIuY2FuV3JpdGUoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvdWxkIG5vdCB3cml0ZSB0byBkaXJlY3RvcnkiKTsNCi0NCi0JCWZpbmFsIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIHNyY0ZpbGVOYW1lKTsNCi0NCi0JCWZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSk7DQotCQlmaW5hbCBCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZPdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCVVuemlwcGVyLklOU1RBTkNFLmNvcHlJbnB1dFN0cmVhbShpc3RyLCBidWZPdXRTdHJlYW0pOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJYnVmT3V0U3RyZWFtLmNsb3NlKCk7DQotCQkJZm9zLmNsb3NlKCk7DQotCQl9DQotDQotCQkvLyBjaGVjayBpZiB0aGUgYXJjaGl2ZSB3YXMgY29waWVkIHN1Y2Nlc3NmdWxseQ0KLQkJaWYgKCFzb3VyY2VGaWxlLmV4aXN0cygpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkFyY2hpdmUgY291bGQgbm90IGJlIGZvdW5kIik7DQotCQl9DQotDQotCQlVbnppcHBlci5JTlNUQU5DRS51bnppcChzb3VyY2VGaWxlLCBkZXN0RGlyLCBmYWxzZSk7DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKiogVXRpbGl0eSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSB0aHJvdWdoIFVSTCAqLw0KLQlwdWJsaWMgU3RyaW5nIHJlYWRVUkxSZXNvdXJjZShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJU3RyaW5nIHJlYWRJbmYgPSBudWxsOw0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSB1cmwub3BlblN0cmVhbSgpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJaW50IGluUmVhZCA9IGluLnJlYWQoKTsNCi0NCi0JCQlyZWFkSW5mID0gIiI7DQotCQkJd2hpbGUgKGluUmVhZCAhPSAtMSkNCi0JCQl7DQotCQkJCXJlYWRJbmYgKz0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGluUmVhZCk7DQotCQkJCWluUmVhZCA9IGluLnJlYWQoKTsNCi0JCQl9DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlpbi5jbG9zZSgpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlYWRJbmY7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBmb3IgcmVwbGFjaW5nIHRoZSB0ZXh0IG9jY3VycmVuY2UgaW4gYSBmaWxlIHdpdGggdGhlIHByb3ZpZGVkIHJlcGxhY2VtZW50Lg0KLQkgKiANCi0JICogQHBhcmFtIGZpbGUNCi0JICogQHBhcmFtIGZpbmQNCi0JICogQHBhcmFtIHJlcGxhY2VtZW50DQotCSAqIEByZXR1cm4NCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gcmVwbGFjZUNvbnRlbnRzSW5GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGZpbmQsIFN0cmluZyByZXBsYWNlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWlmICghZmlsZS5leGlzdHMoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlTdHJpbmcgZmlsZUNvbnRlbnRzID0gcmVhZEZpbGVDb250ZW50cyhmaWxlKTsNCi0NCi0JCWZpbGVDb250ZW50cyA9IGZpbGVDb250ZW50cy5yZXBsYWNlQWxsKGZpbmQsIHJlcGxhY2VtZW50KTsNCi0NCi0JCWZpbGUuZGVsZXRlKCk7DQotCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsNCi0NCi0JCXdyaXRlQ29udGVudHNUb0ZpbGUoZmlsZSwgZmlsZUNvbnRlbnRzKTsNCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBXcml0ZXMgdGhlIHN0cmluZyB0byB0aGUgZ2l2ZW4gZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBmaWxlIC0NCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byB3cml0ZSB0bw0KLQkgKiBAcGFyYW0gZmlsZUNvbnRlbnRzIC0NCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB3cml0ZUNvbnRlbnRzVG9GaWxlKEZpbGUgZmlsZSwgU3RyaW5nIGZpbGVDb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24NCi0Jew0KLQ0KLQkJUHJpbnRXcml0ZXIgcG91dCA9IG5ldyBQcmludFdyaXRlcihmaWxlKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCXBvdXQucHJpbnRsbihmaWxlQ29udGVudHMpOw0KLQkJCXBvdXQuZmx1c2goKTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCXBvdXQuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhbmQgcmV0dXJucyBpdCBhcyBTdHJpbmcuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmlsZSAtDQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gcmVhZCBmcm9tDQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlDQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgcmVhZEZpbGVDb250ZW50cyhGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbg0KLQl7DQotCQlTdHJpbmcgcmVhZEluZiA9IG51bGw7DQotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlpbnQgaW5SZWFkID0gaW4ucmVhZCgpOw0KLQ0KLQkJCXJlYWRJbmYgPSAiIjsNCi0JCQl3aGlsZSAoaW5SZWFkICE9IC0xKQ0KLQkJCXsNCi0JCQkJcmVhZEluZiArPSBTdHJpbmcudmFsdWVPZigoY2hhcikgaW5SZWFkKTsNCi0JCQkJaW5SZWFkID0gaW4ucmVhZCgpOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJdGhyb3cgZTsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCWluLmNsb3NlKCk7DQotCQl9DQotDQotCQlyZXR1cm4gcmVhZEluZjsNCi0JfQ0KLQ0KLQkvKiogQHJldHVybiB0aGUgcmVzb3VyY2UgaW5wdXQgc3RyZWFtIG9mIHRoZSBwcm9qZWN0cyBhcmNoaXZlICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VJbnB1dFN0cmVhbShmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUsIGZpbmFsIFN0cmluZyBwcm9qZWN0U291cmNlRm9sZGVyLCBDbGFzcyByZWxhdGl2ZVJlc291cmNlQmFzZUNsYXNzKQ0KLQl7DQotCQlyZXR1cm4gcmVsYXRpdmVSZXNvdXJjZUJhc2VDbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHByb2plY3RTb3VyY2VGb2xkZXIgKyAiLyIgKyBhcmNoaXZlTmFtZSk7DQotCX0NCi0NCi0JLyoqIE1ldGhvZCBmb3IgaGFuZGxpbmcgdGhlIHVuemlwcGluZyBvZiB0aGUgdGVzdCBwcm9qZWN0cyAqLw0KLQlwdWJsaWMgdm9pZCB1bnppcFRlc3RQcm9qZWN0cyhmaW5hbCBJbnB1dFN0cmVhbSBhcmNoaXZlU3RyZWFtLCBmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUsIGZpbmFsIEZpbGUgZGVzdERpcikgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0NCi0JCWlmIChhcmNoaXZlU3RyZWFtID09IG51bGwpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgYXJjaGl2ZSByZXNvdXJjZSBzdHJlYW0gaXMgbm90IGluaXRpYWxpemVkISBhcmNoaXZlOiAiICsgYXJjaGl2ZU5hbWUgKyAiIC0gZGlyOiAiICsgZGVzdERpcik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQl1bnppcEFyY2hpdmVUb0RpcihhcmNoaXZlU3RyZWFtLCBhcmNoaXZlTmFtZSwgZGVzdERpcik7DQotCQl9IGZpbmFsbHkNCi0JCXsNCi0JCQlhcmNoaXZlU3RyZWFtLmNsb3NlKCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFVuemlwcyB0aGUgY29udGVudCBvZiA8dHQ+emlwRmlsZUxvY2F0aW9uPC90dD4gaW50byA8dHQ+b3V0Rm9sZGVyPC90dD4uDQotCSAqIA0KLQkgKiBAcGFyYW0gemlwRmlsZUxvY2F0aW9uDQotCSAqIEBwYXJhbSBvdXRGb2xkZXINCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFppcHBlZENvbnRlbnQoRmlsZSB6aXBGaWxlTG9jYXRpb24sIEZpbGUgb3V0Rm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oemlwRmlsZUxvY2F0aW9uKTsNCi0JCWFkZFppcHBlZENvbnRlbnQoZmlzLCBvdXRGb2xkZXIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnppcHMgdGhlIGNvbnRlbnQgb2YgPHR0PmlzPC90dD4gaW50byA8dHQ+b3V0Rm9sZGVyPC90dD4uDQotCSAqIA0KLQkgKiBAcGFyYW0gemlwRmlsZUxvY2F0aW9uDQotCSAqIEBwYXJhbSBvdXRGb2xkZXINCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFppcHBlZENvbnRlbnQoSW5wdXRTdHJlYW0gaXMsIEZpbGUgb3V0Rm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbmV3IFppcElucHV0U3RyZWFtKGlzKTsNCi0JCVppcEVudHJ5IGVudHJ5ID0gbnVsbDsNCi0JCXdoaWxlICgoZW50cnkgPSB6aXMuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpDQotCQl7DQotCQkJRmlsZSBvdXRGaWxlID0gbmV3IEZpbGUob3V0Rm9sZGVyLCBlbnRyeS5nZXROYW1lKCkpOw0KLQ0KLQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKQ0KLQkJCXsNCi0JCQkJb3V0RmlsZS5ta2RpcnMoKTsNCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRGaWxlKTsNCi0JCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVsyMDQ4XTsNCi0JCQkJaW50IHJlYWQ7DQotCQkJCXdoaWxlICgocmVhZCA9IHppcy5yZWFkKGJ1ZmYpKSA+IDApDQotCQkJCXsNCi0JCQkJCW91dC53cml0ZShidWZmLCAwLCByZWFkKTsNCi0JCQkJfQ0KLQkJCQlvdXQuY2xvc2UoKTsNCi0JCQl9DQotDQotCQkJemlzLmNsb3NlRW50cnkoKTsNCi0JCX0NCi0NCi0JCXppcy5jbG9zZSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxldGVzIGRpcmVjdG9yeSB3aXRoIGl0cyBjb250ZW50DQotCSAqIA0KLQkgKiBAcGFyYW0gZGlyDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyKQ0KLQl7DQotCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKQ0KLQkJew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vdCBhIGRpcmVjdG9yeSIgKyBkaXIuZ2V0TmFtZSgpKTsNCi0JCX0NCi0NCi0JCWZvciAoU3RyaW5nIHMgOiBkaXIubGlzdCgpKQ0KLQkJew0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgcyk7DQotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkNCi0JCQl7DQotCQkJCWRlbGV0ZURpcmVjdG9yeShmKTsNCi0JCQl9IGVsc2UNCi0JCQl7DQotCQkJCWYuZGVsZXRlKCk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJZGlyLmRlbGV0ZSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkaXJlY3RvcnkgbmFtZWQgdmlhIHRoZSBwYXR0ZXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSArIEZpbGUuc2VwYXJhdG9yICsgZGlyTmFtZQ0KLQkgKiANCi0JICogQHBhcmFtIGRpck5hbWUNCi0JICogQHJldHVybg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoU3RyaW5nIGRpck5hbWUpDQotCXsNCi0JCUZpbGUgdGVtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgZGlyTmFtZSk7DQotCQlpZiAodGVtcERpci5leGlzdHMoKSkNCi0JCXsNCi0JCQlkZWxldGVEaXJlY3RvcnkodGVtcERpcik7DQotCQl9DQotDQotCQlpZiAoIXRlbXBEaXIubWtkaXIoKSkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUZW1wIGRpcmVjb3J5ICIgKyB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIiBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOw0KLQkJfQ0KLQkJLy8gdGVtcERpci5kZWxldGVPbkV4aXQoKTsNCi0NCi0JCXJldHVybiB0ZW1wRGlyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb3B5IHRoZSBjb250ZW50IG9mIDxjb2RlPmZpbGVQYXRoPC9jb2RlPiBhbmQgY29waWVzIGl0IHRvIHRlbXBvcmFyeSBmaWxlIGluIHN5c3RlbSB0ZW1wIGRpcmVjdG9yeS4NCi0JICogDQotCSAqIEBwYXJhbSBjbGFzc0NvbnRleHQNCi0JICogQHBhcmFtIGZpbGVQYXRoDQotCSAqIEByZXR1cm4gY3JlYXRlZCB0ZW1wb3JhcnkgZmlsZQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29weVRvVGVtcExvY2F0aW9uKENsYXNzPD8+IGNsYXNzQ29udGV4dCwgU3RyaW5nIGZpbGVQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBjbGFzc0NvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlUGF0aCk7DQotCQlmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7DQotCQlmaW5hbCBGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUoZGlyLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuamF2YSIpOw0KLQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7DQotDQotCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBGaWxlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMTAyNF07DQotCQkJZm9yIChpbnQgY250ID0gMDsgKGNudCA9IGlzLnJlYWQoYnVmZikpID4gLTE7KQ0KLQkJCXsNCi0JCQkJZm9zLndyaXRlKGJ1ZmYsIDAsIGNudCk7DQotCQkJfQ0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJaXMuY2xvc2UoKTsNCi0JCQlmb3MuY2xvc2UoKTsNCi0JCX0NCi0NCi0JCXJldHVybiB0ZW1wRmlsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZUNvbnRlbnQoRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsNCi0JCXRyeQ0KLQkJew0KLQkJCWZ3LndyaXRlKGNvbnRlbnQpOw0KLQkJfSBmaW5hbGx5DQotCQl7DQotCQkJZncuY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ZpbGVzL1VuemlwcGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ZpbGVzL1VuemlwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5YmZkZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9maWxlcy9VbnppcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlczsNCi0NCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7DQotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsNCi0NCi0vKioNCi0gKiBBIHNpbXBsZSB1dGlsaXR5IGZvciB1bnppcHBpbmcgWklQIGFyY2hpdmVzDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKi8NCi1wdWJsaWMgY2xhc3MgVW56aXBwZXIgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVuemlwcGVyIElOU1RBTkNFID0gbmV3IFVuemlwcGVyKCk7DQotDQotCS8vIEhpZGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KLQlwcml2YXRlIFVuemlwcGVyKCkgew0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb3B5IHRoZSBjb250ZW50IGZyb20gdGhlIDxjb2RlPnNvdXJjZVN0cmVhbTwvY29kZT4gdG8gdGhlDQotCSAqIDxjb2RlPmRlc3RpbmF0aW9uU3RyZWFtPC9jb2RlPg0KLQkgKiANCi0JICogQHBhcmFtIHNvdXJjZVN0cmVhbQ0KLQkgKiBAcGFyYW0gZGVzdFN0cmVhbQ0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjb3B5SW5wdXRTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gc291cmNlU3RyZWFtLA0KLQkJCWZpbmFsIE91dHB1dFN0cmVhbSBkZXN0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOw0KLQkJaW50IGxlbjsNCi0NCi0JCXdoaWxlICgobGVuID0gc291cmNlU3RyZWFtLnJlYWQoYnVmZmVyKSkgPj0gMCkgew0KLQkJCWRlc3RTdHJlYW0ud3JpdGUoYnVmZmVyLCAwLCBsZW4pOw0KLQkJfQ0KLQ0KLQkJZGVzdFN0cmVhbS5mbHVzaCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBVbnppcCB0aGUgemlwIGZpbGUgc3BlY2lmaWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkNCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGaWxlDQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB6aXAgZmlsZQ0KLQkgKiBAcGFyYW0gZGVzdGluYXRpb25EaXINCi0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5DQotCSAqIEBwYXJhbSB0b0xvd2VyQ2FzZQ0KLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGFsbCB0aGUgdW56aXBwZWQgZW50cmllcyB3b3VsZCBiZSBsb3dlcmNhc2VkIChmb3IgKklYDQotCSAqICAgICAgICAgICAgY29tcGF0aWJpbGl0eSkgVGhlIGJhY2tncm91bmQgYmVoaW5kIHRoaXMgcGFyYW1ldGVyIGlzIHRoZQ0KLQkgKiAgICAgICAgICAgIGNhc2UgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIEFCQVAgeG1sIHRlc3QgZGF0YSBkaXJlY3RvcnkgbmFtZXMNCi0JICogICAgICAgICAgICBhbmQgdGhlIHJlYWwgZGlyZWN0b3J5IG5hbWVzIGluIHRoZSBBQkFQIFpJUA0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgd2hlbiBhbnkgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaXMgbnVsbA0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPnNvdXJjZUZpbGU8L2NvZGU+IGRvZXMgbm90IGV4aXN0IG9yIHBvaW50cyB0byBhDQotCSAqICAgICAgICAgICAgIGRpcmVjdG9yeQ0KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICB3aGVuIDxjb2RlPmRlc3RpbmF0aW9uRGlyPC9jb2RlPiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYQ0KLQkgKiAgICAgICAgICAgICBkaXJlY3RvcnkNCi0JICovDQotCXB1YmxpYyB2b2lkIHVuemlwKGZpbmFsIEZpbGUgc291cmNlRmlsZSwgZmluYWwgRmlsZSBkZXN0aW5hdGlvbkRpciwNCi0JCQlmaW5hbCBib29sZWFuIHRvTG93ZXJDYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJY2hlY2tJbnB1dFBhcmFtcyhzb3VyY2VGaWxlLCBkZXN0aW5hdGlvbkRpcik7DQotCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQl6aXBGaWxlID0gbmV3IFppcEZpbGUoc291cmNlRmlsZSk7DQotCQkJRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7DQotDQotCQkJLy8gQ3JlYXRlIGRpciBzdHJ1Y3R1cmUNCi0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQkJCQlmaW5hbCBaaXBFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsNCi0NCi0JCQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJCS8vIFRoaXMgaXMgbm90IHJvYnVzdCwganVzdCBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlcy4NCi0JCQkJCShuZXcgRmlsZShkZXN0aW5hdGlvbkRpciwgdG9Mb3dlckNhc2UgPyBlbnRyeS5nZXROYW1lKCkNCi0JCQkJCQkJLnRvTG93ZXJDYXNlKCkgOiBlbnRyeS5nZXROYW1lKCkpKS5ta2RpcnMoKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBDcmVhdGUgZmlsZXMNCi0JCQllbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7DQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsNCi0JCQkJZmluYWwgWmlwRW50cnkgZW50cnkgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotDQotCQkJCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQ0KLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7DQotCQkJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJ1Zk91dFN0cmVhbSA9IG51bGw7DQotDQotCQkJCXRyeSB7DQotCQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShkZXN0aW5hdGlvbkRpciwNCi0JCQkJCQkJdG9Mb3dlckNhc2UgPyBlbnRyeS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSA6IGVudHJ5DQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOw0KLQkJCQkJYnVmT3V0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcyk7DQotCQkJCQljb3B5SW5wdXRTdHJlYW0oemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSksIGJ1Zk91dFN0cmVhbSk7DQotCQkJCQlmb3MuZmx1c2goKTsNCi0JCQkJCWJ1Zk91dFN0cmVhbS5mbHVzaCgpOw0KLQkJCQl9IGZpbmFsbHkgew0KLQkJCQkJaWYgKGZvcyAhPSBudWxsKSB7DQotCQkJCQkJZm9zLmNsb3NlKCk7DQotCQkJCQl9DQotCQkJCQlpZiAoYnVmT3V0U3RyZWFtICE9IG51bGwpIHsNCi0JCQkJCQlidWZPdXRTdHJlYW0uY2xvc2UoKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgew0KLQkJCQl6aXBGaWxlLmNsb3NlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBjaGVja0lucHV0UGFyYW1zKGZpbmFsIEZpbGUgemlwRmlsZSwgZmluYWwgRmlsZSBkZXN0aW5hdGlvbikgew0KLQkJLy8gQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHppcEZpbGUsICJ6aXBGaWxlIik7DQotCQkvLyBDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZGVzdGluYXRpb24sICJkZXN0aW5hdGlvbiIpOw0KLQkJaWYgKCF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSkgew0KLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQotCQkJCQkiWklQIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgYSBkaXJlY3RvcnkiKTsNCi0JCX0NCi0JCWlmICghZGVzdGluYXRpb24uZXhpc3RzKCkgfHwgIWRlc3RpbmF0aW9uLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKA0KLQkJCQkJIkRlc3RpbmF0aW9uIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIpOw0KLQkJfQ0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3REeW5hbWljTW9jay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9BYnN0cmFjdER5bmFtaWNNb2NrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE1MzE0YjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9BYnN0cmFjdER5bmFtaWNNb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2s7DQotDQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkludm9jYXRpb25EaXNwYXRjaGVyOw0KLQ0KLS8qKg0KLSAqIFRoaXMgY2xhc3MgaXMgZXF1aXZhbGVudCB0byA8Yz5vcmcuam1vY2suY29yZS5BYnN0cmFjdER5bmFtaWNNb2NrPC9jPi4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGNsYXNzIGlzIHBhcmFtZXRlcml6ZWQuIEl0IGV4dGVuZHMgZnJvbQ0KLSAqIDxjPm9yZy5qbW9jay5jb3JlLkFic3RyYWN0RHluYW1pY01vY2s8L2M+IGFuZCBpcyB0aHVzIGJhY2t3YXJkIGNvbXBhdGlibGUuDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKiANCi0gKiBAcGFyYW0gPFQ+DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RHluYW1pY01vY2s8VD4gZXh0ZW5kcyBvcmcuam1vY2suY29yZS5BYnN0cmFjdER5bmFtaWNNb2NrDQotew0KLQ0KLQlwdWJsaWMgQWJzdHJhY3REeW5hbWljTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgbmFtZSwgSW52b2NhdGlvbkRpc3BhdGNoZXIgaW52b2NhdGlvbkRpc3BhdGNoZXIpDQotCXsNCi0JCXN1cGVyKG1vY2tlZFR5cGUsIG5hbWUsIGludm9jYXRpb25EaXNwYXRjaGVyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQWJzdHJhY3REeW5hbWljTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobW9ja2VkVHlwZSwgbmFtZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgQ2xhc3M8VD4gZ2V0TW9ja2VkVHlwZSgpDQotCXsNCi0JCXJldHVybiBzdXBlci5nZXRNb2NrZWRUeXBlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyBhYnN0cmFjdCBUIHByb3h5KCk7DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svQWJzdHJhY3RNb2NrT2JqZWN0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjVjMTM2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL0Fic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuQ29uc3RyYWludDsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuRHluYW1pY01vY2s7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkZvcm1hdHRpbmc7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkludm9jYXRpb25NYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5Nb2NrT2JqZWN0U3VwcG9ydFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5TdHViOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5tYXRjaGVyLkludm9rZUF0TGVhc3RPbmNlTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUubWF0Y2hlci5JbnZva2VBdE1vc3RPbmNlTWF0Y2hlcjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUubWF0Y2hlci5JbnZva2VDb3VudE1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuSW52b2tlT25jZU1hdGNoZXI7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLm1hdGNoZXIuVGVzdEZhaWx1cmVNYXRjaGVyOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5zdHViLlJldHVybkl0ZXJhdG9yU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5SZXR1cm5TdHViOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5zdHViLlRocm93U3R1YjsNCi0NCi0vKioNCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmcm9tIHdoaWNoIHN1Yi1jbGFzc2luZyB0ZXN0IGNhc2VzIGNhbiBpbmhlcml0LiBUaGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gb3JnLmptb2NrLk1vY2tPYmplY3RUZXN0Q2FzZSB3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQNCi0gKiBpZCBkb2VzIG5vdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRvIDxjPm5ld0NvcmVNb2NrPC9jPiBtZXRob2QgYW5kIHRodXMgaXMgbm90IGFibGUgdG8gY3JlYXRlIGFueSBwcm94aWVzLiBUaGUgb3RoZXIgbWFqb3IgZGlmZmVyZW5jZSBpcyB0aGF0DQotICogdGhpcyBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkLiBJdCBzaG91bGQgYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIHN1Yi1jbGFzc2VzIHRoYXQgcHJvdmlkZSBzdHJvbmdseSB0eXBlZCBtb2Nrcy4gVGhpcyBjbGFzcyBhbHNvIHRha2UgYWR2YW50YWdlIG9mDQotICogc29tZSBvZiB0aGUgamF2YSA1IHN1Z2Fycy4gRm9yIGV4YW1wbGUgInZhcmFyZ3MiLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlIGV4dGVuZHMgTW9ja09iamVjdFN1cHBvcnRUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIEFic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlKCkNCi0Jew0KLQl9DQotDQotCXB1YmxpYyBBYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZShTdHJpbmcgbmFtZSkNCi0Jew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBtb2NrIG9iamVjdCB0aGF0IG1vY2tzIHRoZSBnaXZlbiB0eXBlLiBUaGUgbW9jayBvYmplY3QgaXMgbmFtZWQgYWZ0ZXIgdGhlIHR5cGU7IHRoZSBleGFjdCBuYW1lIGlzIGNhbGN1bGF0ZWQgYnkNCi0JICoge0BsaW5rICNkZWZhdWx0TW9ja05hbWVGb3JUeXBlfS4NCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlDQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgdG8gYmUgbW9ja2VkLg0KLQkgKiBAcmV0dXJuIEEge0BsaW5rIE1vY2t9IG9iamVjdCB0aGF0IG1vY2tzIDx2YXI+bW9ja2VkVHlwZTwvdmFyPi4NCi0JICovDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgPFQ+IE1vY2s8VD4gbW9jayhDbGFzcyBtb2NrZWRUeXBlKQ0KLQl7DQotCQlyZXR1cm4gbW9jayhtb2NrZWRUeXBlLCBkZWZhdWx0TW9ja05hbWVGb3JUeXBlKG1vY2tlZFR5cGUpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIG1vY2sgb2JqZWN0IHRoYXQgbW9ja3MgdGhlIGdpdmVuIHR5cGUgYW5kIGlzIGV4cGxpY2l0bHkgZ2l2ZW4gYSBuYW1lLiBUaGUgbW9jayBvYmplY3QgaXMgbmFtZWQgYWZ0ZXIgdGhlIHR5cGU7IHRoZSBleGFjdCBuYW1lIGlzDQotCSAqIGNhbGN1bGF0ZWQgYnkge0BsaW5rICNkZWZhdWx0TW9ja05hbWVGb3JUeXBlfS4NCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlDQotCSAqICAgICAgICAgICAgVGhlIHR5cGUgdG8gYmUgbW9ja2VkLg0KLQkgKiBAcGFyYW0gcm9sZU5hbWUNCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbW9jayBvYmplY3QNCi0JICogQHJldHVybiBBIHtAbGluayBNb2NrfSBvYmplY3QgdGhhdCBtb2NrcyA8dmFyPm1vY2tlZFR5cGU8L3Zhcj4uDQotCSAqLw0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCi0JcHVibGljIDxUPiBNb2NrPFQ+IG1vY2soQ2xhc3MgbW9ja2VkVHlwZSwgU3RyaW5nIHJvbGVOYW1lKQ0KLQl7DQotCQlmaW5hbCBNb2NrPFQ+IG5ld01vY2sgPSBuZXcgTW9jazxUPihuZXdDb3JlTW9jayhtb2NrZWRUeXBlLCByb2xlTmFtZSkpOw0KLQkJcmVnaXN0ZXJUb1ZlcmlmeShuZXdNb2NrKTsNCi0JCXJldHVybiBuZXdNb2NrOw0KLQl9DQotDQotCXByb3RlY3RlZCBhYnN0cmFjdCA8VD4gRHluYW1pY01vY2sgbmV3Q29yZU1vY2soQ2xhc3M8VD4gbW9ja2VkVHlwZSwgU3RyaW5nIHJvbGVOYW1lKTsNCi0NCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMNCi0JICogDQotCSAqIEBwYXJhbSBtb2NrZWRUeXBlDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdE1vY2tOYW1lRm9yVHlwZShDbGFzczw/PiBtb2NrZWRUeXBlKQ0KLQl7DQotCQlyZXR1cm4gIm1vY2siICsgRm9ybWF0dGluZy5jbGFzc1Nob3J0TmFtZShtb2NrZWRUeXBlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShPYmplY3QgbykNCi0Jew0KLQkJcmV0dXJuIG5ldyBSZXR1cm5TdHViKG8pOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGJvb2xlYW4gcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IEJvb2xlYW4ocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoYnl0ZSByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgQnl0ZShyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShjaGFyIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBDaGFyYWN0ZXIocmVzdWx0KSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgcmV0dXJuVmFsdWUoc2hvcnQgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IFNob3J0KHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGludCByZXN1bHQpDQotCXsNCi0JCXJldHVybiByZXR1cm5WYWx1ZShuZXcgSW50ZWdlcihyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShsb25nIHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBMb25nKHJlc3VsdCkpOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVyblZhbHVlKGZsb2F0IHJlc3VsdCkNCi0Jew0KLQkJcmV0dXJuIHJldHVyblZhbHVlKG5ldyBGbG9hdChyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5WYWx1ZShkb3VibGUgcmVzdWx0KQ0KLQl7DQotCQlyZXR1cm4gcmV0dXJuVmFsdWUobmV3IERvdWJsZShyZXN1bHQpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3R1YiByZXR1cm5JdGVyYXRvcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pDQotCXsNCi0JCXJldHVybiBuZXcgUmV0dXJuSXRlcmF0b3JTdHViKGNvbGxlY3Rpb24pOw0KLQl9DQotDQotCXB1YmxpYyBTdHViIHJldHVybkl0ZXJhdG9yKE9iamVjdFtdIGFycmF5KQ0KLQl7DQotCQlyZXR1cm4gbmV3IFJldHVybkl0ZXJhdG9yU3R1YihhcnJheSk7DQotCX0NCi0NCi0JcHVibGljIFN0dWIgdGhyb3dFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkNCi0Jew0KLQkJcmV0dXJuIG5ldyBUaHJvd1N0dWIodGhyb3dhYmxlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgb25jZSgpDQotCXsNCi0JCXJldHVybiBuZXcgSW52b2tlT25jZU1hdGNoZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgYXRMZWFzdE9uY2UoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludm9rZUF0TGVhc3RPbmNlTWF0Y2hlcigpOw0KLQl9DQotDQotCXB1YmxpYyBJbnZvY2F0aW9uTWF0Y2hlciBhdE1vc3RPbmNlKCkNCi0Jew0KLQkJcmV0dXJuIG5ldyBJbnZva2VBdE1vc3RPbmNlTWF0Y2hlcigpOw0KLQl9DQotDQotCXB1YmxpYyBJbnZvY2F0aW9uTWF0Y2hlciBleGFjdGx5KGludCBleHBlY3RlZENvdW50KQ0KLQl7DQotCQlyZXR1cm4gbmV3IEludm9rZUNvdW50TWF0Y2hlcihleHBlY3RlZENvdW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW52b2NhdGlvbk1hdGNoZXIgbmV2ZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IFRlc3RGYWlsdXJlTWF0Y2hlcigibm90IGV4cGVjdGVkIik7DQotCX0NCi0NCi0JcHVibGljIEludm9jYXRpb25NYXRjaGVyIG5ldmVyKFN0cmluZyBlcnJvck1lc3NhZ2UpDQotCXsNCi0JCXJldHVybiBuZXcgVGVzdEZhaWx1cmVNYXRjaGVyKCJub3QgZXhwZWN0ZWQgKCIgKyBlcnJvck1lc3NhZ2UgKyAiKSIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2luY2UgMS4wLjENCi0JICovDQotCXB1YmxpYyBTdHViIG9uQ29uc2VjdXRpdmVDYWxscyhTdHViLi4uIHN0dWJzKQ0KLQl7DQotCQlyZXR1cm4gb25Db25zZWN1dGl2ZUNhbGxzKHN0dWJzKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDEuMS4wDQotCSAqLw0KLQlwdWJsaWMgU3R1YiBkb0FsbChTdHViLi4uIHN0dWJzKQ0KLQl7DQotCQlyZXR1cm4gZG9BbGwoc3R1YnMpOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29uc3RyYWludCBjb2xsZWN0aW9uV2l0aEVsZW1lbnRzKGZpbmFsIGludCBleHBlY3RlZENvbGxlY3Rpb25TaXplLCBmaW5hbCBPYmplY3QuLi4gb2JqZWN0cykNCi0Jew0KLQkJcmV0dXJuIG5ldyBDb25zdHJhaW50KCl7DQotDQotCQkJcHVibGljIGJvb2xlYW4gZXZhbChPYmplY3QgYXJnMCkNCi0JCQl7DQotCQkJCWZpbmFsIENvbGxlY3Rpb248Pz4gY29sID0gKENvbGxlY3Rpb248Pz4pYXJnMDsNCi0JCQkJZm9yKE9iamVjdCBvIDogb2JqZWN0cykNCi0JCQkJew0KLQkJCQkJaWYoIWNvbC5jb250YWlucyhvKSkNCi0JCQkJCXsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJDQotCQkJCXJldHVybiBvYmplY3RzLmxlbmd0aCA9PSBleHBlY3RlZENvbGxlY3Rpb25TaXplOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgU3RyaW5nQnVmZmVyIGRlc2NyaWJlVG8oU3RyaW5nQnVmZmVyIGFyZzApDQotCQkJew0KLQkJCQlyZXR1cm4gYXJnMDsNCi0JCQl9fTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svTW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YzNiOWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svTW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBvcmcuam1vY2suY29yZS5EeW5hbWljTW9jazsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gPGM+b3JnLmptb2NrLk1vY2s8L2M+IGNsYXNzIGZyb20gSk1vY2suIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIGEgcGFyYW1ldGVyaXplZCAoZ2VuZXJpYykgdmVyc2lvbi4gVGhpcyBtYWtlcw0KLSAqIGl0IGEgbG90IGVhc2llciBmb3IgdXNlIGFzIG5vIG1hbnVhbCBjYXN0cyB0byB0aGUgbW9ja2VkIHR5cGUgYXJlIHJlcXVpcmVkIGJ5IHRoZSBwcm9ncmFtbWVyLiBUaGlzIGNsYXNzIGV4dGVuZHMgZnJvbSA8Yz5vcmcuam1vY2suTW9jazwvYz4gc28gaXRzDQotICogZnVsbHkgYmFja3dhcmQgY29tcGF0aWJsZS4NCi0gKiANCi0gKiBAc2VlIG9yZy5qbW9jay5Nb2NrDQotICovDQotcHVibGljIGNsYXNzIE1vY2s8VD4gZXh0ZW5kcyBvcmcuam1vY2suTW9jaw0KLXsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdHMgYSBuZXcgbW9jayBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLiBUaGUgbmV3IG1vY2sgaGFzIHRoZSBzcGVjaWZpZWQgbmFtZS4gVGhpcyBuYW1lIHdpbGwgYmUgc2hvd24gYnkgYWxsIHJlcG9ydHMgY29uY2VybmluZyB0aGlzIG1vY2sNCi0JICogaW5zdGFuY2UuIFN1Y2ggcmVwb3J0cyBhcmUgdW5tYWNoZWQgaW52b2NhdGlvbnMgYW5kIHNvIG9uLg0KLQkgKiANCi0JICogQHBhcmFtIG1vY2tlZFR5cGUgLQ0KLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIGJlIG1vY2tlZC4gVGhpcyBjb3VsZCBiZSBlaXRoZXIgY2xhc3Mgb3IgaW50ZXJmYWNlLg0KLQkgKiBAcGFyYW0gbmFtZSAtDQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGlzIG1vY2sNCi0JICovDQotCXB1YmxpYyBNb2NrKENsYXNzPFQ+IG1vY2tlZFR5cGUsIFN0cmluZyBuYW1lKQ0KLQl7DQotCQlzdXBlcihtb2NrZWRUeXBlLCBuYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBhIG5ldyBtb2NrIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gbW9ja2VkVHlwZSAtDQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgdG8gYmUgbW9ja2VkLiBUaGlzIGNsYXNzIG5lZWRzIHRvIGJlIGVpdGhlciBjbGFzcyBvciBpbnRlcmZhY2UuDQotCSAqLw0KLQlwdWJsaWMgTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlKQ0KLQl7DQotCQlzdXBlcihtb2NrZWRUeXBlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBuZXcgTW9jayB0aGF0IHdyYXBzIHRoZSBzdXBwbGllZCA8Yz5EeW5hbWljTW9jazwvYz4gaW5zdGFuY2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gYXJnMCAtDQotCSAqICAgICAgICAgICAgdGhlIGR5bmFtaWMgbW9jayBpbnN0YW5jZQ0KLQkgKi8NCi0JcHVibGljIE1vY2soRHluYW1pY01vY2sgYXJnMCkNCi0Jew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgdGhlIHByb3h5IGluc3RhbmNlIGZvciB0aGlzIG1vY2suDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBwcm94eSBpbnN0YW5jZSBmb3IgdGhpcyBtb2NrLg0KLQkgKi8NCi0JQE92ZXJyaWRlDQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQ0KLQlwdWJsaWMgVCBwcm94eSgpDQotCXsNCi0JCXJldHVybiAoVCkgc3VwZXIucHJveHkoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2tPYmplY3RUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay9Nb2NrT2JqZWN0VGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDEyNjA2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL01vY2tPYmplY3RUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jazsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzLkJlZm9yZUFmdGVyRW5hYmxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXMuSUJlZm9yZUFmdGVyRW5hYmxlZDsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuQ29yZU1vY2s7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLkR5bmFtaWNNb2NrOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5WZXJpZmlhYmxlOw0KLQ0KLQ0KLS8qKg0KLSAqIEFuIHRlc3QgY2FzZSBiYXNlIGNsYXNzIGZvciBtb2NrIG9iamVjdHMgdGVzdCBjYXNlLiBUaGlzIG9uZSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gb3JnLmptb2NrLmNnbGliLk1vY2tPYmplY3RUZXN0Q2FzZS4gVGhlcmUgYXJlIHNldmVyYWwNCi0gKiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMgdGhvdWdoLiBUaGlzIHRlc3QgY2FzZSBjbGFzcyBhc3N1bWVzIHRoYXQgdGhlIGxvYWRlciBvZiB0aGUgdGVzdCBjYXNlIGNsYXNzIGlzIGFibGUgdG8gbG9hZCBib3RoIHRoZSBjbGFzcyBiZWluZyBtb2NrZWQgYW5kDQotICogdGhlIGptb2NrIGNsYXNzZXMuIFRodXMgdGVzdCBjYXNlIGNsYXNzIGxvYWRlciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgbW9jayB0eXBlLiBUaGlzIG1vY2sgdGVzdCBjYXNlIGFsc28gcHJvdmlkZXMgdHdvIG5ldyA8Yz5tb2NrPC9jPiBtZXRob2RzLg0KLSAqIFRoZXNlIG1ldGhvZHMgY2FuIGluc3RhbnRpYXRlIGEgbW9jayBmb3IgYSBnaXZlbiBjbGFzcyBieSBleGVjdXRpbmcgdGhlIGNsYXNzJ3MgY29uc3RydWN0b3IuIFRoZSBtZXRob2RzIDxjPjwvYz4gYW5kIDxjPjwvYz4gaW5oZXJpdGVkIGZyb20NCi0gKiA8Yz5BYnN0cmFjdE1vY2tPYmplY3RUZXN0Q2FzZTwvYz4gY3JlYXRlIG1vY2tzIHdpdGhvdXQgZXhlY3V0aW5nIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbW9ja2VkIGNsYXNzLiBUaGV5IHVzZSB0aGUgU1VOJ3MgcmVmbGVjdGlvbiBtZWNoYW5pc20gYW5kDQotICogYXJlIGFibGUgdG8gY3JlYXRlIGNsYXNzZXMgd2l0aG91dCBhIHZpc2libGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBvciB3aXRob3V0IGNvbnN0cnVjdG9yIGF0IGFsbC4gVGhpcyBmdW5jdGlvbmFsbGl0eSBob3dldmVyIGlzIHBsYXRmb3JtIHNwZWNpZmljLg0KLSAqIEl0IGNhbiBiZSBjb21waWxlZCBhbmQgZXhlY3V0ZWQgb25seSBvbiBTVU4gVk1zLiBTaG91bGQgdGhlIGNvZGUgYmUgZXhlY3V0ZWQgb24gYW5vdGhlciBWTSBtb3N0IGxpa2VseSBhIDxjPk5vQ2xhc3NEZWZGb3VuZEVycm9yPC9jPiB3aWxsIG9jdXJyLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vY2tPYmplY3RUZXN0Q2FzZSBleHRlbmRzIEFic3RyYWN0TW9ja09iamVjdFRlc3RDYXNlIGltcGxlbWVudHMgSUJlZm9yZUFmdGVyRW5hYmxlZA0KLXsNCi0JcHJpdmF0ZSBmaW5hbCBCZWZvcmVBZnRlckVuYWJsZXIgYmFlID0gbmV3IEJlZm9yZUFmdGVyRW5hYmxlcih0aGlzKTsNCi0JcHVibGljIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGJlZm9yZVRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcnVuQmFyZUludGVybmFsKCkgdGhyb3dzIFRocm93YWJsZQ0KLQl7DQotCQlzdXBlci5ydW5CYXJlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlDQotCXsNCi0JCWJhZS5ydW5CYXJlKCk7DQotCX0NCi0JDQotCXByaXZhdGUgTGlzdDxNb2NrPD8+PiBtb2Nrc1RvVmVyaWZ5ID0gbmV3IFZlY3RvcjxNb2NrPD8+PigpOw0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBhIG5ldyA8Yz5Nb2NrT2JqZWN0VGVzdENhc2U8L2M+IGluc3RhbmNlIHdpdGggbm8gbmFtZQ0KLQkgKiANCi0JICovDQotCXB1YmxpYyBNb2NrT2JqZWN0VGVzdENhc2UoKQ0KLQl7DQotCX0NCi0NCi0JcHVibGljIExpc3Q8TW9jazw/Pj4gZ2V0TW9ja3NUb1ZlcmlmeSgpDQotCXsNCi0JCWZpbmFsIExpc3Q8TW9jazw/Pj4gY29weSA9IG5ldyBBcnJheUxpc3Q8TW9jazw/Pj4oKTsNCi0JCWNvcHkuYWRkQWxsKG1vY2tzVG9WZXJpZnkpOw0KLQkJcmV0dXJuIGNvcHk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJUb1ZlcmlmeShWZXJpZmlhYmxlIGFyZzApDQotCXsNCi0JCW1vY2tzVG9WZXJpZnkucmVtb3ZlKGFyZzApOw0KLQkJc3VwZXIudW5yZWdpc3RlclRvVmVyaWZ5KGFyZzApOw0KLQl9DQotDQotCUBPdmVycmlkZQ0KLQlwdWJsaWMgdm9pZCB2ZXJpZnkoKQ0KLQl7DQotCQltb2Nrc1RvVmVyaWZ5LmNsZWFyKCk7DQotCQlzdXBlci52ZXJpZnkoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0cyBhIG5ldyA8Yz5Nb2NrT2JqZWN0VGVzdENhc2U8L2M+IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lDQotCSAqIA0KLQkgKiBAcGFyYW0gbmFtZSAtDQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyB0ZXN0IGNhc2UuDQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlDQotCSAqLw0KLQlwdWJsaWMgTW9ja09iamVjdFRlc3RDYXNlKFN0cmluZyBuYW1lKQ0KLQl7DQotCQlzdXBlcihuYW1lKTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHJvdGVjdGVkIDxUPiBEeW5hbWljTW9jayBuZXdDb3JlTW9jayhDbGFzczxUPiBtb2NrZWRUeXBlLCBTdHJpbmcgcm9sZU5hbWUpDQotCXsNCi0JCXJldHVybiBuZXcgQ29yZU1vY2sobW9ja2VkVHlwZSwgcm9sZU5hbWUpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svU3R1YlV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL1N0dWJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NWFjODc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svU3R1YlV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuU3R1YjsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuc3R1Yi5SZXR1cm5TdHViOw0KLWltcG9ydCBvcmcuam1vY2suY29yZS5zdHViLlN0dWJTZXF1ZW5jZTsNCi0NCi0vKioNCi0gKiBVdGlscyBmb3IgY3JlYXRpbmcgbW9yZSBjb21wbGV4IGptb2NrIHN0dWJzDQotICogDQotICogQGF1dGhvciBIcmlzdG8gU2FiZXYNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3R1YlV0aWxzDQotew0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIHN0dWIgdGhhdCB3aWxsIHJldHVybiB0aGUgcHJveHkgZm9yIHRoZSBuZXh0IG1vY2sgaW4gdGhlIHN1cHBsaWVkIGFycmF5IG9uIGEgY29uc2VxdXRpdmUgY2FsbC4gSS5lLiB0aGUgZmlyc3QgY2FsbCByZXR1cm5zIHRoZSBwcm94eQ0KLQkgKiBhdCA8Yz5yZXR1cm5WYWx1ZXNbMF08L2M+LCB0aGUgc2Vjb25kIGNhbGwgd2lsbCByZXR1cm4gdGhlIHByb3h5IGZvciB0aGUgbW9jayBhdCA8Yz5yZXR1cm5WYWx1ZXNbMV08L2M+LCBhbmQgc28gZm9ydGgNCi0JICogDQotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZXMgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBtb2NrcyB3aGljaCB3aWxsIGJlIHJldHVybmVkIG9uIGNvbnNlcXV0aXZlIGNhbGxzDQotCSAqIEByZXR1cm4gLSBhIHN0dWIgdGhhdCB3aWxsIHJldHVybiB0aGUgcHJveGllcyBmb3IgdGhlIHNwZWNpZmllZCBtb2NrcyBvbiBlYWNoIGNvbnNlcXV0aXZlIGNhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3R1YiBvbkNvbnNlcXV0aXZlQ2FsbHNXaWxsUmV0dXJuTW9ja3MoTW9jazw/PltdIHJldHVyblZhbHVlcykNCi0Jew0KLQkJZmluYWwgU3R1YltdIHJldHVyblN0dWJzID0gbmV3IFN0dWJbcmV0dXJuVmFsdWVzLmxlbmd0aF07DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJldHVyblZhbHVlcy5sZW5ndGg7IGkrKykNCi0JCXsNCi0JCQlyZXR1cm5TdHVic1tpXSA9IG5ldyBSZXR1cm5TdHViKHJldHVyblZhbHVlc1tpXS5wcm94eSgpKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgU3R1YlNlcXVlbmNlKHJldHVyblN0dWJzKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIG1vY2tzIHRvIGFuIGFycmF5IG9mIHByb3hpZXMgZm9yIHRoZXNlIG1vY2tzLiBBbGwgbW9ja3Mgc2hvdWxkIGJlIG1vY2tzIGZvciBvbmUgYW5kIHRoZQ0KLQkgKiBzYW1lIHR5cGUuDQotCSAqIEBwYXJhbSA8VD4gLSB0aGUgdHlwZSBvZiB0aGUgbW9ja2VkIGNsYXNzDQotCSAqIEBwYXJhbSBtb2NrcyAtIHRoZSBhcnJheSBvZiBtb2NrcyB0byBiZSBjb252ZXJ0ZWQgdG8gcHJveGllcw0KLQkgKiBAcGFyYW0gcHJveGllcyAtIGFuIGFycmF5IG9mIHRoZSB0eXBlIG9mIHRoZSBwcm94eS4gSXQgd2lsbCBiZSB1c2VkIHRvIHN0b3JlIHRoZSBwcm94aWVzIGZvciB0aGUgbW9ja3MNCi0JICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIC0gdGhyb3duIGlmIHRoZSBhcnJheXMgYXJlIHdpdGggZGlmZmVyZW50IHNpemVzLg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyA8VD4gdm9pZCBtb2Nrc1RvUHJveGllcyhNb2NrPFQ+W10gbW9ja3MsIFRbXSBwcm94aWVzKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vY2tzLmxlbmd0aDsgaSsrKQ0KLQkJew0KLQkJCXByb3hpZXNbaV0gPSBtb2Nrc1tpXS5wcm94eSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIHJldHVybiBzdHViIHRoYXQgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgbW9jayBwcm94aWVzIGZvciB0aGUgc3VwcGxpZWQgYXJyYXkgb2YgbW9ja3MuDQotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZXMgLSBhbiBhcnJheSBvZiBtb2Nrcywgd2hvc2UgcHJveGllcyBoYXMgdG8gYmUgcmV0dXJuZWQNCi0JICogQHJldHVybiAtIGEgc3R1YiB3aWNoIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIHByb3hpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHBhc3NlZCBtb2Nrcy4NCi0JICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIC0gaWYgdGhlIHR3byBhcnJheXMgYXJlIHdpdGggZGlmZmVyZW50IGxlbmd0aHMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgPFQ+U3R1YiByZXR1cm5BcnJheU9mTW9ja3MoTW9jazxUPltdIHJldHVyblZhbHVlcywgVFtdIHByb3hpZXMpDQotCXsNCi0JCW1vY2tzVG9Qcm94aWVzKHJldHVyblZhbHVlcywgcHJveGllcyk7DQotCQlyZXR1cm4gbmV3IFJldHVyblN0dWIocHJveGllcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBzdHViIHRoYXQgb24gY29uc2VxdXRpdmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIG5leHQgYm9vbGVhbiBpbiB0aGUgc3VwcGxpZWQgYXJyYXkgSS5lLiB0aGUgZmlyc3QgY2FsbCByZXR1cm5zIHRoZSBib29sZWFuIGF0DQotCSAqIDxjPnJldHVyblZhbHVlc1swXTwvYz4sIHRoZSBzZWNvbmQgY2FsbCB3aWxsIHJldHVybiB0aGUgYm9vbGVhbiBhdCA8Yz5yZXR1cm5WYWx1ZXNbMV08L2M+LCBhbmQgc28gZm9ydGgNCi0JICogDQotCSAqIEBwYXJhbSByZXR1cm5WYWx1ZXMgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBib29sZWFucyB3aGljaCB3aWxsIGJlIHJldHVybmVkIG9uIGNvbnNlcXV0aXZlIGNhbGxzDQotCSAqIEByZXR1cm4gLSBhIHN0dWIgdGhhdCB3aWxsIHJldHVybiB0aGUgYm9vbGVhbnMgZm9yIGVhY2ggY29uc2VxdXRpdmUgY2FsbA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHViIG9uQ29uc2VjdXRpdmVDYWxsc1dpbGxSZXR1cm5Cb29sZWFuKGJvb2xlYW5bXSByZXR1cm5WYWx1ZXMpDQotCXsNCi0JCWZpbmFsIFN0dWJbXSByZXR1cm5TdHVicyA9IG5ldyBTdHViW3JldHVyblZhbHVlcy5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXR1cm5WYWx1ZXMubGVuZ3RoOyBpKyspDQotCQl7DQotCQkJcmV0dXJuU3R1YnNbaV0gPSBuZXcgUmV0dXJuU3R1YihyZXR1cm5WYWx1ZXNbaV0pOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBTdHViU2VxdWVuY2UocmV0dXJuU3R1YnMpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgPFQ+IFN0dWIgcmV0dXJuQ29sbGVjdGlvbkNvbnRhaW5pbmcoVFtdIGNvbnRhaW5lZCkgew0KLQkJZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsID0gbmV3IEFycmF5TGlzdDxUPigpOw0KLQkJZm9yKFQgbyA6IGNvbnRhaW5lZCkgew0KLQkJCWNvbGwuYWRkKG8pOw0KLQkJfQ0KLQkJcmV0dXJuIG5ldyBSZXR1cm5TdHViKGNvbGwpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHViIHJldHVybkNvbGxlY3Rpb25Db250YWluaW5nKFQgY29udGFpbmVkKSB7DQotCQlmaW5hbCBDb2xsZWN0aW9uPFQ+IGNvbGwgPSBuZXcgQXJyYXlMaXN0PFQ+KDEpOw0KLQkJY29sbC5hZGQoY29udGFpbmVkKTsNCi0JCXJldHVybiBuZXcgUmV0dXJuU3R1Yihjb2xsKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9CZWZvcmVBZnRlckVuYWJsZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyRW5hYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0OWQxNjUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyRW5hYmxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHdvcmsgYnkgU2hheSBCYW5vbiAoaHR0cDovL3d3dy5raW1jaHkub3JnL2JlZm9yZV9hZnRlcl90ZXN0Y2FzZV93aXRoX2p1bml0LykNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotDQotcHVibGljIGNsYXNzIEJlZm9yZUFmdGVyRW5hYmxlciB7DQotCQ0KLQlwcml2YXRlIGZpbmFsIElCZWZvcmVBZnRlckVuYWJsZWQgdGM7DQotCQ0KLSAgICBwcml2YXRlIGludCB0ZXN0Q291bnQgPSAwOw0KLSANCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdG90YWxUZXN0Q291bnQ7DQotIA0KLSAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZUFmdGVyVGVzdENhc2UgPSBmYWxzZTsNCi0gDQotICAgIHB1YmxpYyBCZWZvcmVBZnRlckVuYWJsZXIoSUJlZm9yZUFmdGVyRW5hYmxlZCB0Yykgew0KLSAgICAJdGhpcy50YyA9IHRjOw0KLSAgICAJdG90YWxUZXN0Q291bnQgPSBjb3VudFRvdGFsVGVzdHMoKTsNCi0gICAgfQ0KLSANCi0gICAgcHVibGljIHZvaWQgcnVuQmFyZSgpIHRocm93cyBUaHJvd2FibGUgew0KLSAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7DQotICAgICAgICBpZiAodGVzdENvdW50ID09IDApIHsNCi0gICAgICAgICAgICBiZWZvcmVUZXN0Q2FzZSgpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgdGVzdENvdW50Kys7DQotICAgICAgICB0cnkgew0KLSAgICAgICAgICAgIHRjLnJ1bkJhcmVJbnRlcm5hbCgpOw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHJ1bm5pbmcpIHsNCi0gICAgICAgICAgICBleGNlcHRpb24gPSBydW5uaW5nOw0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKHRlc3RDb3VudCA9PSB0b3RhbFRlc3RDb3VudCkgew0KLSAgICAgICAgICAgIGlmICghZGlzYWJsZUFmdGVyVGVzdENhc2UpIHsNCi0gICAgICAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgICAgIGFmdGVyVGVzdENhc2UoKTsNCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGFmdGVyVGVzdENhc2UpIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkgZXhjZXB0aW9uID0gYWZ0ZXJUZXN0Q2FzZTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgIGRpc2FibGVBZnRlclRlc3RDYXNlID0gZmFsc2U7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB0aHJvdyBleGNlcHRpb247DQotICAgIH0NCi0gDQotICAgIHB1YmxpYyB2b2lkIGRpc2FibGVBZnRlclRlc3RDYXNlKCkgew0KLSAgICAgICAgZGlzYWJsZUFmdGVyVGVzdENhc2UgPSB0cnVlOw0KLSAgICB9DQotIA0KLSAgICAvKioNCi0gICAgICogQ2FsbGVkIGJlZm9yZSBhbnkgdGVzdHMgd2l0aGluIHRoaXMgdGVzdCBjYXNlLg0KLSAgICAgKg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYmVmb3JlVGVzdENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0gICAgCXRjLmJlZm9yZVRlc3RDYXNlKCk7DQotICAgIH0NCi0gDQotICAgIC8qKg0KLSAgICAgKiBDYWxsZWQgYWZ0ZXIgYWxsIHRoZSB0ZXN0cyB3aXRoaW4gdGhlIHRlc3QgY2FzZQ0KLSAgICAgKiBoYXZlIGV4ZWN1dGVkLg0KLSAgICAgKg0KLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLSAgICAgKi8NCi0gICAgcHJvdGVjdGVkIHZvaWQgYWZ0ZXJUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb24gew0KLSAgICAJdGMuYWZ0ZXJUZXN0Q2FzZSgpOw0KLSAgICB9DQotIA0KLSAgICBwcml2YXRlIGludCBjb3VudFRvdGFsVGVzdHMoKSB7DQotICAgICAgICBpbnQgY291bnQgPSAwOw0KLSAgICAgICAgQ2xhc3M8Pz4gc3VwZXJDbGFzcyA9IHRjLmdldENsYXNzKCk7DQotICAgICAgICBWZWN0b3I8U3RyaW5nPiBuYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOw0KLSAgICAgICAgd2hpbGUgKFRlc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdXBlckNsYXNzKSkgew0KLSAgICAgICAgICAgIE1ldGhvZFtdIG1ldGhvZHMgPSBzdXBlckNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOw0KLSAgICAgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsNCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtZXRob2QuZ2V0TmFtZSgpOw0KLSAgICAgICAgICAgICAgICBpZiAobmFtZXMuY29udGFpbnMobmFtZSkpDQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCi0gICAgICAgICAgICAgICAgbmFtZXMuYWRkRWxlbWVudChuYW1lKTsNCi0gICAgICAgICAgICAgICAgaWYgKGlzVGVzdE1ldGhvZChtZXRob2QpKSB7DQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSBzdXBlckNsYXNzLmdldFN1cGVyY2xhc3MoKTsNCi0gICAgICAgIH0NCi0gICAgICAgIHJldHVybiBjb3VudDsNCi0gICAgfQ0KLSANCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzVGVzdE1ldGhvZChNZXRob2QgbSkgew0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsNCi0gICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVycyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsNCi0gICAgICAgIENsYXNzPD8+IHJldHVyblR5cGUgPSBtLmdldFJldHVyblR5cGUoKTsNCi0gICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmxlbmd0aCA9PSAwICYmIG5hbWUuc3RhcnRzV2l0aCgidGVzdCIpICYmIHJldHVyblR5cGUuZXF1YWxzKFZvaWQuVFlQRSk7DQotICAgIH0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvQmVmb3JlQWZ0ZXJUZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvQmVmb3JlQWZ0ZXJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5ZWFiYTdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0JlZm9yZUFmdGVyVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay50ZXN0Y2FzZXM7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmVmb3JlQWZ0ZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIGltcGxlbWVudHMgSUJlZm9yZUFmdGVyRW5hYmxlZCB7DQotCQ0KLQlwcml2YXRlIGZpbmFsIEJlZm9yZUFmdGVyRW5hYmxlciBiZmUgPSBuZXcgQmVmb3JlQWZ0ZXJFbmFibGVyKHRoaXMpOw0KLQkNCi0JcHVibGljIHZvaWQgcnVuQmFyZUludGVybmFsKCkgdGhyb3dzIFRocm93YWJsZSB7DQotCQlzdXBlci5ydW5CYXJlKCk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsNCi0JCWJmZS5ydW5CYXJlKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvRXF1YWxzVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvam1vY2svdGVzdGNhc2VzL0VxdWFsc1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVlZDBlMjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvRXF1YWxzVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2sudGVzdGNhc2VzOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsNCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotLyoqDQotICogQW4gYWJzdHJhY3QgdGVzdCBjYXNlIGZvciB0aGUgPGM+T2JqZWN0LmVxdWFscyhPYmplY3QpPC9jPiBhbmQgPGM+T2JqZWN0Lmhhc2hDb2RlKCk8L2M+IG1ldGhvZHMuIFRoaXMgdGVzdCBjYXNlIHBlcmZvcm1zIHRoZSB0ZXN0cyBmb3IgPGM+ZXF1YWxzPC9jPg0KLSAqIGFuZCA8Yz5oYXNoQ29kZTwvYz4gc2ltdWx0YW5pZXNseSBhcyB0aGV5IGFyZSB0aWdodGx5IGNvbm5lY3RlZC4gVGhlIHRlc2Nhc2UgdGVzdCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2YgZXF1YWxzL2hhc0NvZGU6DQotICogPHA+DQotICogMS4gZXF1YWxzIHJlZmxleGl2aXR5IDIuIGVxdWFscyBzeW1ldHJpY2l0eSAzLiBlcXVhbHMgdHJhbnNpdGl2eXRlIDQuIGhhc2hDb2RlIHN0YXRiaWxpdHkgNS4gaGFzaENvZGUgaW1tdXRhYmlsaXR5IDYuIGVxdWFscyBpcyBzdWl0YWJsZSBmb3INCi0gKiBzdWJjbGFzc2VzDQotICogPC9wPg0KLSAqIA0KLSAqIFRoZSB0ZXN0IGNhc2VzIGlzIGFic3RyYWN0IGFuZCBuZWVkIHRvIGJlIHN1YmxjYXNzZWQgYnkgY29uY3JldGUgdGVzdCBjYXNlLiBTZXZlcmFsIGFic3RyYWN0IG1ldGhvZHMgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSB0ZXN0IGNhc2VzLg0KLSAqIA0KLSAqIEBhdXRob3IgSHJpc3RvIFNhYmV2DQotICogDQotICogQHBhcmFtIDxUPg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFcXVhbHNUZXN0Q2FzZTxUPiBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHRlc3RDbGFzczsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZXMgYSBuZXcgPGM+RXF1YWxzVGVzdENhc2U8L2M+IGluc3RhbmNlIHRvIHRlc3QgdGhlIGVxdWFscyBtZXRob2Qgb2YgdGhlIHN1cHBsaWVkIGNsYXNzDQotCSAqIA0KLQkgKiBAcGFyYW0gdGVzdENsYXNzIC0NCi0JICogICAgICAgICAgICB0aGUgY2xhc3Mgd2hvc2UgZXF1YWxzIG1ldGhvZCB3aWxsIGJlIHRlc3RlZA0KLQkgKi8NCi0JcHVibGljIEVxdWFsc1Rlc3RDYXNlKENsYXNzPFQ+IHRlc3RDbGFzcykNCi0Jew0KLQkJdGhpcyhudWxsLCB0ZXN0Q2xhc3MpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgbmV3IDxjPkVxdWFsc1Rlc3RDYXNlPC9jPiBpbnN0YW5jZSB0byB0ZXN0IHRoZSBlcXVhbHMgbWV0aG9kIG9mIHRoZSBzdXBwbGllZCBjbGFzcy4gVGhpcyB0ZXN0IGNhc2UgYWxzbyB0YWtlcyBhIG5hbWUgcGFyYW10ZXIsIHdoaWNoDQotCSAqIGkgcGFzc2VkIHRvIDxjPlRlc3RDYXNlPC9jPiBzdXBlciBjb25zdHJ1Y3Rvci4gSS5lLiB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UNCi0JICogDQotCSAqIEBwYXJhbSBuYW1lIC0NCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UNCi0JICogQHBhcmFtIHRlc3RDbGFzcyAtDQotCSAqICAgICAgICAgICAgdGhlIGNsYXNzIHdob3NlIGVxdWFscyBtZXRob2Qgd2lsbCBiZSB0ZXN0ZWQNCi0JICovDQotCXB1YmxpYyBFcXVhbHNUZXN0Q2FzZShTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gdGVzdENsYXNzKQ0KLQl7DQotCQlhc3NlcnROb3ROdWxsKCJ0ZXN0IGNsYXNzIHBhc3NlZCBpbiBjb25zdHJ1Y3RvciB3YXMgbnVsbCIsIHRlc3RDbGFzcyk7DQotCQl0aGlzLnRlc3RDbGFzcyA9IHRlc3RDbGFzczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogT2J0YWlucyBhIG5ldyBpdGVyYXRvciBvZiBpbnN0YW5jZXMgZm9yIHRoZSB0ZXN0ZWQgY2xhc3MuDQotCSAqIA0KLQkgKiBAcGFyYW0gaXRlcmF0aW9ucyAtDQotCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaS5lIHRoZSBudW1iZXIgb2YgdGltZXMgb25lIGNhbiBpbnZva2UgPGM+SXRlcmF0b3IubmV4dCgpPC9jPiB3aXRob3V0aCBnZXR0aW5nIDxjPk5vU3VjaEVsZW1lbnRFeGNlcHRpb248L2M+DQotCSAqICAgICAgICAgICAgZXhjZXB0aW9uDQotCSAqIEByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2YgaW5zdGFuY2VkIGZvciB0aGUgdGVzdGVkIGNsYXNzOw0KLQkgKi8NCi0JYWJzdHJhY3QgcHVibGljIEl0ZXJhdG9yPFQ+IG5ld09iamVjdEl0ZXJhdG9yKGludCBpdGVyYXRpb25zKTsNCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlc3RlZCBjbGFzcy4gRWFjaCBjYWxsIHRvIHRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaW5zdGFuY2UsIHdoaWNoIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG8gdGhlIGluc3RhbmNlDQotCSAqIHJldHVybmVkIGJ5IHRoZSBwcmVmdmlvdXMgY2FsbCBidXQgaXMgbm90IGlkZW50aWNhbC4gRm9yIGV4YW1wbGUgaWYgdGhlIHRlc3RlZCBjbGFzcyB3YXMgPGM+U3RyaW5nPC9jPiB0aGUgbW9zdCBvYnZpb3VzIGltcGxlbWVudGF0aW9uIG9mIHRoaXMNCi0JICogbWV0aG9kIHdvdWxkIGJlIDxjPg0KLQkgKiA8cD4NCi0JICogcmV0dXJuIG5ldyBTdHJpbmcoInRlc3Qgc3RyaW5nIikNCi0JICogPC9wPg0KLQkgKiA8L2M+DQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IGNsYXNzIGFzc3VtZWQgdG8gYmUgZXF1YWwgdG8gdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgaW5zdGFuY2VzDQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgVCBuZXdFcXVhbEluc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBPYnRhaW5zIGEgbmV3IGluc3RhbmNlIG9mIGEgc2luZ2xlIGNsYXNzLCB3aGljaCBpcyBhIHN1YmNsYXNzIG9mIHRoZSB0ZXN0ZWQgY2xhc3MuIFRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSB0aGUgPGM+ZXF1YWxzPC9jPiBtZXRob2Qgb2YNCi0JICogdGhlIHRlc3RlZCBjbGFzcy4gQWxsIGluc3RhbmNlcyBzaG91bGQgYmUgZXF1YWwuIFRoZSByZXR1cm5lZCBpbnN0YW5jZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmFsdWVzIG9mIGFsbCB0aGUgaW5oZXJpdGVkIGZpZWxkcyBhcyB0aGUNCi0JICogaW5zdGFuY2VzIHJldHVyZWQgYnkgPGM+bmV3RXF1YWxJbnN0YW5jZTwvYz4NCi0JICogDQotCSAqIEByZXR1cm4gcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiBzaW5nbGUgc3VibGNhc3Mgb2YgdGhlIHRlc3RlZCBjbGFzcy4gRWFjaCBjYWxsIHNob3VsZCByZXR1cm4gYW4gaW5zdGFuY2UgZXF1YWwgdG8gdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgYnV0DQotCSAqICAgICAgICAgbm90IGlkZW50aWNhbC4gTnVsbCBpZiB0aGUgdGVzdGVkIGNsYXNzIGlzIGZpbmFsDQotCSAqLw0KLQlhYnN0cmFjdCBwdWJsaWMgVCBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIE9idGFpbnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRoZSB0ZXN0ZWQgY2xhc3MuIFRoZSBzaW5nbGUgcmVzdHJpY3Rpb24gb24gdGhlIHJldHVybmVkIGluc3RhbmNlcyBpcyB0aGF0IHRoZXkgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byB0aGUNCi0JICogaW5zdGFuY2VzIHJldHVybmVkIGJ5IDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZXN0IGNsYXNzLiBUaGUgbmV3bHkgcmV0dXJuZWQgaW5zdGFuY2UgaXMgbm90IGVxdWFsIHRvIHRoZSBpbnN0YW5jZXMgcmV0dXJuZWQgYnkgPGM+bmV3RXF1YWxJbnN0YW5jZTwvYz4NCi0JICovDQotCWFic3RyYWN0IHB1YmxpYyBUIG5ld05vbkVxdWFsSW5zdGFuY2UoKTsNCi0NCi0JLyoqDQotCSAqIE1vZGlmaWVzIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YgdGhlIHRlc3RlZCBjbGFzcy4gVGhlIGluc3RhbmNlIHNob3VsZCBiZSBtb2RpZmllZCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQncyBub3QgZXF1YWwgdG8gdGhlIGluc3RhbmNlcyByZXR1cmVkIGJ5DQotCSAqIDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+IGFucyA8Yz5uZXdOb25lRXF1YWxJbnN0YW5jZSgpPC9jPi4gSWYgdGhlIHRlc3RlZCBjbGFzcyBpcyBpbW11dGFibGUgdGhlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGJlDQotCSAqIGVtcHR5DQotCSAqIA0KLQkgKiBAcGFyYW0gaW5zdGFuY2UgLQ0KLQkgKiAgICAgICAgICAgIHRoZSBpbnN0YW5jZSB0byBiZSBtb2RpZmllZC4NCi0JICovDQotCWFic3RyYWN0IHB1YmxpYyB2b2lkIG1vZGlmeU9iamVjdEluc3RhbmNlKFQgaW5zdGFuY2UpOw0KLQ0KLQkvKioNCi0JICogT2J0YWlucyB0aGUgbnVtYmVyIG9mIGNvbXBhcmlzb25zIHRoYXQgd2lsbCBiZSBtYWRlIGZvciB0aGUgcmVmbGV4aXZpdHkgdGVzdC4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQNCi0JICogdmFsdWUuIEJ5IGRlZmF1bHQgdGhpcyBudW1iZXIgaXMgMTAwLg0KLQkgKiANCi0JICogQHJldHVybiAtIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSByZWZsZXhpdml0eSB0ZXN0Lg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRJdGVyYXRpb25zRm9yUmVmbGl4aXZpdHlUZXN0KCkNCi0Jew0KLQkJcmV0dXJuIDEwMDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogT2JhdGFpbnMgdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB0aGF0IHdpbGwgYmUgbWFkZSBmb3IgdGhlIHN5bWl0cmljaXR5IHRlc3QuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQNCi0JICogdmFsdWUuIEJ5IGRlZmF1bHQgdGhpcyBudW1iZXIgaXMgMTAwMA0KLQkgKiANCi0JICogQHJldHVybiAtIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSByZWZsaXhpdml0eSB0ZXN0Lg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRJdGVyYXRpb25zRm9yU3ltZXRyaWNpdHlUZXN0KCkNCi0Jew0KLQkJcmV0dXJuIDEwMDA7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9iYXRhaW5zIHRoZSBudW1iZXIgb2YgY29tcGFyaXNvbnMgdGhhdCB3aWxsIGJlIG1hZGUgZm9yIHRoZSB0cmFuc2l0aXZpdHkgdGVzdC4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRlIGJ5IHN1YmNsYXNzZXMgdG8gc3BlY2lmeSBhDQotCSAqIGRpZmZlcmVudCB2YWx1ZS4gQnkgZGVmYXVsdCB0aGlzIG51bWJlciBpcyAyMDAwDQotCSAqIA0KLQkgKiBAcmV0dXJuIC0gdGhlIG51bWJlciBvZiBjb21wYXJpc29ucyB0aGF0IHdpbGwgYmUgbWFkZSBmb3IgdGhlIHRyYW5zaXRpdml0eSB0ZXN0Lg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRJdGVyYXRpb25zRm9yVHJhbnNpdGl2aXR5VGVzdCgpDQotCXsNCi0JCXJldHVybiAyMDAwOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyBpcyByZWZsZXhpdmUuIEl0IGVuZm9yY2VzIHRoZSBydWxlIGEuZXF1YWxzKGEpID09IHRydWUuIFRoaXMgdGVzdCBhbHNvIHRlc3RzIHRoYXQgaGFzaENvZGUgZnVuY3Rpb24gaXMgc3RhYmxlKCkuIEkuZS4NCi0JICogaGFzaENvZGUgZG9lc24ndCBjaGFuZ2UgaXQncyB2YWx1ZSBiZXR3ZWVuIHNldmVyYWwgaW52b2NhdGlvbnMsIGFzIHdlbGwgYXMgdGhhdCBoYXNoQ29kZSBpcyBpbW11dGFibGUgb3ZlciBvYmplY3QgY2hhbmdlLiBUaGUgdGVzdCBzdHJhdGVneSBpcw0KLQkgKiB0byBjcmVhdGUgYW4gbmV3IG9iamVjdCBpdGVyYXRvciBhbmQgdGhlbiBmb3IgZWFjaCByZXR1cm5lZCBpbnN0YW5jZToNCi0JICogDQotCSAqIDxvbD4NCi0JICogPGxpPkNvbXBhcmUgaXQgd2l0aCBpdHNlbGY8L2xpPg0KLQkgKiA8bGk+Y2hlY2sgdGhhdCBpdHMgaGFzaCBjb2RlIHN0YXlzIHRoZSBzYW1lPC9saT4NCi0JICogPGxpPm1vZGlmeSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgYnkgY2FsbGluZyA8Yz5tb2RpZnlJbnN0YW5jZTwvYz4gYW5kIHRoZW4gY2hlY2sgdGhlIGhhc2hDb2RlIGFnYWluPC9saT4NCi0JICogPC9vbD4NCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1bHNSZWZsZXhpdmUoKQ0KLQl7DQotCQlmaW5hbCBpbnQgaXRlcmF0aW9uc0ZvclRoaXNUZXN0ID0gZ2V0SXRlcmF0aW9uc0ZvclJlZmxpeGl2aXR5VGVzdCgpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VGl0ZXJhdG9yID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0JCXdoaWxlIChvYmplY3RUaXRlcmF0b3IuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWZpbmFsIFQgb2JqZWN0VCA9IG9iamVjdFRpdGVyYXRvci5uZXh0KCk7DQotCQkJYXNzZXJ0VHJ1ZSgiZXF1YWxzIGlzIG5vdCByZWZsZXhpdmUiLCBvYmplY3RULmVxdWFscyhvYmplY3RUKSk7DQotCQkJZmluYWwgaW50IGluaXRpYWxIYXNoQ29kZSA9IG9iamVjdFQuaGFzaENvZGUoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnNGb3JUaGlzVGVzdDsgaSsrKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJoYXNoQ29kZSBpcyBub3Qgc3RhYmxlIHVwb24gbXVsdGlwbGUgY2FsbHMiLCBpbml0aWFsSGFzaENvZGUsIG9iamVjdFQuaGFzaENvZGUoKSk7DQotCQkJfQ0KLQkJCW1vZGlmeU9iamVjdEluc3RhbmNlKG9iamVjdFQpOw0KLQkJCWFzc2VydEVxdWFscygiaGFzaENvZGUgaXMgbm90IHN0YWJsZSB1cG9uIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0IiwgaW5pdGlhbEhhc2hDb2RlLCBvYmplY3RULmhhc2hDb2RlKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IGVxdWFscyBpcyBzeW1ldHJpYyBpLmUuIGEuZXF1YWxzKGIpIDw9PT4gYi5lcXVhbHMoYSkuIFRoaXMgbWV0aG9kIGFsc28gdGVzdHMgdGhhdCBoYXNoQ29kZSBiZWhhdmVzIGNvcnJlY3RseSBpbiBzZW5zZSBhLnF1YWxzKGIpID0+DQotCSAqIGEuaGFzaENvZGUoKSA9PSBiLmhhc2hDb2RlKCkuIFRoaXMgdGVzdCB1c2VzIHR3byBvYmplY3QgaXRlcmF0b3JzLiBPbmUgZm9yIGEgYW5kIG9uZSBmb3IgYiwgd2hlcmUgYSBhbmQgYiBhcmUgZnJvbSB0aGUgYWJvdmUgcnVsZS4gRWFjaCBvZg0KLQkgKiB0aGVzZSBpdGVyYXRvcnMgYXJlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy4gVGhpcyBtZXRob2QgYWxzbyBjaGVja3MgdGhhdCB3aGVuZXZlciB0d28gaW5zdGFuY2VzIHJldHVybmVkIGJ5IHRoZSB0d28NCi0JICogaXRlcmF0b3JzIGFyZSBlcXVhbCB0aGVuIHRoZWlyIGhhc2NvZGUgaXMgZXF1YWwuDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1N5bWV0cmljKCkNCi0Jew0KLQkJZmluYWwgaW50IGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCA9IGdldEl0ZXJhdGlvbnNGb3JTeW1ldHJpY2l0eVRlc3QoKTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjEgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VEl0ZXJhdG9yMiA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQl3aGlsZSAob2JqZWN0VEl0ZXJhdG9yMS5oYXNOZXh0KCkpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHR3byBvYmplY3QgaXRlcmF0b3JzIGRvbid0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIG9iamVjdHMiLCBvYmplY3RUSXRlcmF0b3IyLmhhc05leHQoKSk7DQotCQkJZmluYWwgVCBvYmplY3RUMSA9IG9iamVjdFRJdGVyYXRvcjEubmV4dCgpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDIgPSBvYmplY3RUSXRlcmF0b3IyLm5leHQoKTsNCi0JCQlpZiAob2JqZWN0VDEuZXF1YWxzKG9iamVjdFQyKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoIkVxdWFscyBpcyBub3Qgc3ltZXRyaWMiLCBvYmplY3RUMi5lcXVhbHMob2JqZWN0VDEpKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgiSGFzaGNvZGUgaXMgbm90IHRoZSBzYW1lIGZvciBlcXVhbCBpbnN0YW5jZXMiLCBvYmplY3RUMS5oYXNoQ29kZSgpID09IG9iamVjdFQyLmhhc2hDb2RlKCkpOw0KLQkJCX0gZWxzZSBpZiAob2JqZWN0VDIuZXF1YWxzKG9iamVjdFQxKSkNCi0JCQl7DQotCQkJCWZhaWwoIkVxdWFscyBpcyBub3Qgc3ltZXRyaWMiKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgZXF1YWxzIGlzIHRyYW5zaXRpdmUgaS5lLiBhLmVxdWFscyhiKSAmIGIuZXF1YWxzKGMpID0+IGEuZXF1YWxzKGMpLiBUaGlzIHRlc3QgdXNlcyB0aHJlZSBvYmplY3QgaXRlcmF0b3JzLiBPbmUgZm9yIGEsIG9uZSBmb3IgYiwgYW5kDQotCSAqIG9uZSBmb3IgYywgd2hlcmUgYSxiLGMgYXJlIGZyb20gdGhlIGFib3ZlIHJ1bGUuIEVhY2ggb2YgdGhlc2UgaXRlcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzVHJhbnNpdGl2ZSgpDQotCXsNCi0JCWZpbmFsIGludCBpdGVyYXRpb25zRm9yVGhpc1Rlc3QgPSBnZXRJdGVyYXRpb25zRm9yVHJhbnNpdGl2aXR5VGVzdCgpOw0KLQkJZmluYWwgSXRlcmF0b3I8VD4gb2JqZWN0VEl0ZXJhdG9yMSA9IG5ld09iamVjdEl0ZXJhdG9yKGl0ZXJhdGlvbnNGb3JUaGlzVGVzdCk7DQotCQlmaW5hbCBJdGVyYXRvcjxUPiBvYmplY3RUSXRlcmF0b3IyID0gbmV3T2JqZWN0SXRlcmF0b3IoaXRlcmF0aW9uc0ZvclRoaXNUZXN0KTsNCi0JCWZpbmFsIEl0ZXJhdG9yPFQ+IG9iamVjdFRJdGVyYXRvcjMgPSBuZXdPYmplY3RJdGVyYXRvcihpdGVyYXRpb25zRm9yVGhpc1Rlc3QpOw0KLQ0KLQkJd2hpbGUgKG9iamVjdFRJdGVyYXRvcjEuaGFzTmV4dCgpKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIlRoZSB0aHJlZSBvYmplY3QgaXRlcmF0b3JzIGRvbid0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIG9iamVjdHMiLCBvYmplY3RUSXRlcmF0b3IyLmhhc05leHQoKSk7DQotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHRocmVlIG9iamVjdCBpdGVyYXRvcnMgZG9uJ3QgaGF2ZSBlcXVhbCBudW1iZXIgb2Ygb2JqZWN0cyIsIG9iamVjdFRJdGVyYXRvcjMuaGFzTmV4dCgpKTsNCi0JCQlmaW5hbCBUIG9iamVjdFQxID0gb2JqZWN0VEl0ZXJhdG9yMS5uZXh0KCk7DQotCQkJZmluYWwgVCBvYmplY3RUMiA9IG9iamVjdFRJdGVyYXRvcjIubmV4dCgpOw0KLQkJCWZpbmFsIFQgb2JqZWN0VDMgPSBvYmplY3RUSXRlcmF0b3IzLm5leHQoKTsNCi0NCi0JCQlpZiAob2JqZWN0VDEuZXF1YWxzKG9iamVjdFQyKSAmJiBvYmplY3RUMS5lcXVhbHMob2JqZWN0VDMpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZSgiZXF1YWxzIGlzIG5vdCB0cmFuc2l0aXZlIiwgb2JqZWN0VDIuZXF1YWxzKG9iamVjdFQzKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IDxjPmVxdWFsPC9jPiByZXR1cm5zIGZhbHNlIGlmIDxjPm51bGw8L2M+IGlzIHBhc3NlZCBhcyBhcmd1bWVudA0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zRmFsc2VJZk51bGxQYXNzZWQoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQgPSB0aGlzLm5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWFzc2VydEZhbHNlKCJlcXVhbHMgcmV0dXJuZWQgdHJ1ZSB3aGVuIG51bGwgcGFzc2VkIGZvciBvdGhlciBvYmplY3QiLCBvYmplY3RULmVxdWFscyhudWxsKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgPGM+ZXF1YWw8L2M+IHJldHVybnMgZmFsc2UgaWYgYSBub24tZXF1YWwgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4gVGhlIHR3byBub24gZXF1YWwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGJ5IGNhbGxpbmcNCi0JICogPGM+bmV3RXF1YWxJbnN0YW5jZTwvYz4gYW5kIDxjPiBuZXdOb25FcXVhbEluc3RhbmNlPC9jPg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNSZXR1cm5zRmFsc2VPbk5vbkVxdWFscygpDQotCXsNCi0JCWZpbmFsIFQgb2JqZWN0VDEgPSB0aGlzLm5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWZpbmFsIFQgb2JqZWN0VDIgPSB0aGlzLm5ld05vbkVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWFzc2VydFRydWUoIkVxdWFscyByZXBvcnRlZCB0cnVlIGZvciBpbnN0YW5jZXMgYXNzdW1lZCBub24gZXF1YWwuIiwgIW9iamVjdFQxLmVxdWFscyhvYmplY3RUMikgJiYgIW9iamVjdFQyLmVxdWFscyhvYmplY3RUMSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBUZXN0cyB0aGF0IDxjPmVxdWFsPC9jTCByZXR1cm5zIHRydWUgaWYgYW4gZXF1YWwgb2JqZWN0IGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4gVGhlIGluc3RhbmNlcyB0aGF0IGFyZSBjb21wYXJlZCBhcmUgb2J0YWluZWQgYnkgdHdvDQotCSAqIGNvbnNlY3V0aXZlIGNhbGxzIHRvIDxjPm5ld0VxdWFsSW5zdGFuY2U8L2M+DQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1JldHVybnNUcnVlT25FcXVhbHMoKQ0KLQl7DQotCQlmaW5hbCBUIG9iamVjdFQxID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlmaW5hbCBUIG9iamVjdFQyID0gdGhpcy5uZXdFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlhc3NlcnRUcnVlKCJFcXVhbHMgcmVwb3J0ZWQgZmFsc2UgZm9yIGluc3RhbmNlcyBhc3N1bWVkIGVxdWFsLiIsIG9iamVjdFQxLmVxdWFscyhvYmplY3RUMikgJiYgb2JqZWN0VDIuZXF1YWxzKG9iamVjdFQxKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlc3RzIHRoYXQgZXF1YWxzIHJldHVybnMgZmFsc2UgaWYgYW4gb2JqZWN0IG9mIGFub3RoZXIgY2xhc3MgaXMgcGFzc2VkLiBJbiBjYXNlIHRoYXQgdGhlIHRlc3RlZCBjbGFzcyBpcyBub3QgZmluYWwgdGhpcyB0ZXN0IHBhc3NlcyBhIHN1YmNsYXNzDQotCSAqIG9mIHRoZSB0ZXN0IGNsYXNzIGFzIGFuIGFyZ3VtZW50IHRvIDxjPmVxdWFsczwvYz4uIFRoZSBwYXNzZWQgYW5jZXN0b3Igb2JqZWN0IGhhcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYWxsIGl0cyBmaWVsZC4gVGhpcyBpcyBpbnRlbmRlZCB0byBjYWh0Y2gNCi0JICogd3JvbmcgaW1wbGVtZW50YXRpb25zIHVzaW5nICJpbnN0YW5jZW9mIiByYXRoZXIgdGhhbiA8Yz5nZXRDbGFzcygpID09IG90aGVyLmdldENsYXNzKCk8L2M+DQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc1JldHVybnNGYWxzZUlmT3RoZXJDbGFzc1Bhc3NlZCgpDQotCXsNCi0JCWZpbmFsIFQgb2JqZWN0VCA9IG5ld0VxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCU9iamVjdCBvYmplY3QgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2VDaGVja0NvcnJlY3QoKTsNCi0JCWlmIChvYmplY3QgPT0gbnVsbCkNCi0JCXsNCi0JCQkvLyBjbGFzcyBpcyBmaW5hbC4gTm8gYW5jZXN0b3IgY291bGQgYmUgY3JlYXRlZC4gVXNlIHNvbWUgb3RoZXIgY2xhc3MuDQotCQkJb2JqZWN0ID0gbmV3IE9iamVjdCgpOw0KLQkJfQ0KLQkJYXNzZXJ0RmFsc2UoImVxdWFscyByZXR1cm5lZCB0cnVlIHdoZW4gb2JqZWN0IG9mIGFub3RoZXIgdHlwZSBwYXNzZWQiLCBvYmplY3RULmVxdWFscyhvYmplY3QpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdHMgdGhhdCA8Yz5lcXVhbHM8L2M+IGlzIHByb3Blcmx5IGltcGxlbWVudGVkIGZvciB1c2UgaW4gc3ViY2xhc3Nlcy4gSXQgdGFrZXMgdHdvIGVxdWFsIGFuY2VzdG9yIGluc3RhbmNlcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IgZXF1YWxpdHkuDQotCSAqIFNpbmNlIHRoZSBhbmNlc3RvciBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSB0aGUgZXF1YWxzIG1ldGhvZC4gVGhlIHRlc3RzIGFzc2VydHMgdGhhdCBlcXVhbHMgc2hvdWxkIHJldHVybiB0cnVlLg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNTdWl0YWJsZUZvckFuY2VzdG9ycygpDQotCXsNCi0JCWZpbmFsIFQgYW5jZXN0b3JUMSA9IG5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpOw0KLQkJZmluYWwgVCBhbmNlc3RvclQyID0gbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCk7DQotCQlpZiAoYW5jZXN0b3JUMSA9PSBudWxsKQ0KLQkJew0KLQkJCWFzc2VydE51bGwoDQotCQkJCQkJCQkJCQkiVGhlIG5ld0FuY2VzdG9ySW5zdGFuY2UoKSBtZXRob2QgcmV0dXJuZWQgbnVsbCBvbiB0aGUgc2Vjb25kIGludm9jYXRpb24sIHdoaWxlIGl0IHJldHVybiBhIHZhbHVlIGRpZmZlcmV0IHRoYW4gbnVsbCBmcm9tIHRoZSBmaXJzdCIsDQotCQkJCQkJCQkJCQlhbmNlc3RvclQyKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlhc3NlcnRUcnVlKGFuY2VzdG9yVDEuZXF1YWxzKGFuY2VzdG9yVDIpICYmIGFuY2VzdG9yVDIuZXF1YWxzKGFuY2VzdG9yVDEpKTsNCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIFQgbmV3QW5jZXN0b3JFcXVhbEluc3RhbmNlQ2hlY2tDb3JyZWN0KCkNCi0Jew0KLQkJZmluYWwgVCBhbmNlc3RvclQgPSBuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UoKTsNCi0JCWlmIChhbmNlc3RvclQgPT0gbnVsbCkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKCJuZXdBbmNlc3RvckVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgbnVsbCwgYWx0aG91Z2ggdGhlIHRlc3QgY2xhc3MgIiwgTW9kaWZpZXIuaXNGaW5hbCh0ZXN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkpKTsNCi0JCX0gZWxzZQ0KLQkJew0KLQkJCWFzc2VydFRydWUoIm5ld0FuY2VzdG9yRXF1YWxJbnN0YW5jZSByZXR1cm5lZCBvYmplY3Qgb2YgY2xhc3MgIiArIGFuY2VzdG9yVC5nZXRDbGFzcygpICsgIiwgd2hpY2ggaXMgbm90IHN1YnR5cGUgb2YgIg0KLQkJCQkJCQkJCQkJKyB0ZXN0Q2xhc3MuZ2V0TmFtZSgpLCB0ZXN0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhbmNlc3RvclQuZ2V0Q2xhc3MoKSkpOw0KLQkJfQ0KLQkJcmV0dXJuIGFuY2VzdG9yVDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFQgbmV3RXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgb2JqZWN0VCA9IG5ld0VxdWFsSW5zdGFuY2UoKTsNCi0JCWFzc2VydFRydWUoIm5ld0VxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBvYmplY3RULmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkV4cGVjdGVkIHdhcyBjbGFzcyAiICsgdGVzdENsYXNzLmdldE5hbWUoKSwNCi0JCQkJCQkJCQkJdGVzdENsYXNzID09IG9iamVjdFQuZ2V0Q2xhc3MoKSk7DQotCQlyZXR1cm4gb2JqZWN0VDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFQgbmV3Tm9uRXF1YWxJbnN0YW5jZUNoZWNrQ29ycmVjdCgpDQotCXsNCi0JCWZpbmFsIFQgb2JqZWN0VCA9IG5ld05vbkVxdWFsSW5zdGFuY2UoKTsNCi0JCWFzc2VydFRydWUoIm5ld05vbkVxdWFsSW5zdGFuY2UgcmV0dXJuZWQgb2JqZWN0IG9mIGNsYXNzICIgKyBvYmplY3RULmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIkV4cGVjdGVkIHdhcyBjbGFzcyAiICsgdGVzdENsYXNzLmdldE5hbWUoKSwNCi0JCQkJCQkJCQkJdGVzdENsYXNzID09IG9iamVjdFQuZ2V0Q2xhc3MoKSk7DQotCQlyZXR1cm4gb2JqZWN0VDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9JQmVmb3JlQWZ0ZXJFbmFibGVkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2ptb2NrL3Rlc3RjYXNlcy9JQmVmb3JlQWZ0ZXJFbmFibGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxMTVlZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qbW9jay90ZXN0Y2FzZXMvSUJlZm9yZUFmdGVyRW5hYmxlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLnRlc3RjYXNlczsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElCZWZvcmVBZnRlckVuYWJsZWQgew0KLQ0KLQlwdWJsaWMgdm9pZCBiZWZvcmVUZXN0Q2FzZSgpIHRocm93cyBFeGNlcHRpb247DQotCQ0KLQlwdWJsaWMgdm9pZCBhZnRlclRlc3RDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbjsNCi0JDQotCXB1YmxpYyB2b2lkIHJ1bkJhcmVJbnRlcm5hbCgpIHRocm93cyBUaHJvd2FibGU7DQotCQ0KLQkNCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9qb2JzL0pvYlV0aWxzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2pvYnMvSm9iVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDVlMjA4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL2pvYnMvSm9iVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9iczsNCi0NCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaENvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy50aHJlYWRpbmcuVGVzdENvbnRleHQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLklMb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5sb2dnaW5nLkxvZ2dlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsNCi0NCi1wdWJsaWMgY2xhc3MgSm9iVXRpbHMNCi17DQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9ySm9ic0ludGVycnVwdGFibGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJd2hpbGUgKFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5jdXJyZW50Sm9iKCkgIT0gbnVsbCkNCi0JCXsNCi0JCQlkZWxheSg1KTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckpvYnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXdhaXRGb3JEdW1teUpvYihKb2IuSU5URVJBQ1RJVkUpOw0KLQkJDQotCQl3aGlsZSAodHJ1ZSkNCi0JCXsNCi0JCQl0cnkNCi0JCQl7DQotCQkJCXdhaXRGb3JKb2JzSW50ZXJydXB0YWJsZSgpOw0KLQkJCQlicmVhazsNCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkNCi0JCQl7DQotDQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gaTAzNjUwOSBhZGRlZCBjb3VzZSB3YWl0aW5nIGZvciBqb2JzIGlzIG5vdCBlbm91Z2h0DQotCQl3YWl0Rm9ySW5kZXhlcigpOw0KLQkJDQotCQkvLyBGb3JjZSBub3RpZmljYXRpb25zDQotCQl3YWl0Rm9yTm90aWZpY2F0aW9ucygpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxheShmaW5hbCBsb25nIG1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCXsNCi0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOw0KLQkJLy8gaWYgdGhpcyBpcyB0aGUgVUkgdGhyZWFkLCB0aGVuIHByb2Nlc3MgdGhlIGlucHV0DQotCQlpZiAoZGlzcGxheSAhPSBudWxsKQ0KLQkJew0KLQkJCWZpbmFsIGxvbmcgZW50VGltZU1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgbWlsbGlzOw0KLQkJCXdoaWxlIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSA8IGVudFRpbWVNaWxsaXMpDQotCQkJew0KLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpDQotCQkJCXsNCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlkaXNwbGF5LnVwZGF0ZSgpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJVGhyZWFkLnNsZWVwKDEwMDApOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvckluZGV4ZXIoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCxTZWFyY2hQYXR0ZXJuLlJfRVhBQ1RfTUFUQ0gsIG51bGwsIA0KLQkJCQlTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUsIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTLCBTZWFyY2hFbmdpbmUNCi0JCQkJCQkJCQkJCQkJCQkJCQkuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbMF0pLCBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKQ0KLQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikNCi0JCQkJCQkJCQkJCXB1YmxpYyB2b2lkIGFjY2VwdENsYXNzKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsDQotCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQ0KLQkJCQkJCQkJCQkJew0KLQkJCQkJCQkJCQkJfQ0KLQkJCQkJCQkJCQkJQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpDQotCQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRJbnRlcmZhY2UoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywNCi0JCQkJCQkJCQkJCQkJCQkJCQkJU3RyaW5nIHBhdGgpDQotCQkJCQkJCQkJCQl7DQotCQkJCQkJCQkJCQl9DQotCQkJCQkJCQkJCX0sIElKYXZhU2VhcmNoQ29uc3RhbnRzLldBSVRfVU5USUxfUkVBRFlfVE9fU0VBUkNILCBudWxsKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNjaGVkdWxlIGEgZHVtbXkgam9iIHdpdGggdGhlIHByaW9yaXR5IHNwZWNpZmllZCBhbmQgd2FpdCBmb3IgaXQgaXMgZG9uZQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3YWl0Rm9yRHVtbXlKb2IoZmluYWwgaW50IHByaW9yaXR5KQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQl3YWl0Rm9yRHVtbXlKb2JXaXRoUHJpbyhwcmlvcml0eSk7DQotCQl9DQotCQljYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JEdW1teUpvYldpdGhQcmlvKGZpbmFsIGludCBwcmlvKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24NCi0Jew0KLQkJSm9iIG15RHVtbXlKb2IgPSBuZXcgSm9iKCJEVU1NWSIpew0KLQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQkJew0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCQl9fTsNCi0JCQkNCi0JCW15RHVtbXlKb2Iuc2V0UHJpb3JpdHkocHJpbyk7DQotCQlteUR1bW15Sm9iLnNldFVzZXIoZmFsc2UpOw0KLQkJbXlEdW1teUpvYi5zY2hlZHVsZSgpOw0KLQkJDQotCQlteUR1bW15Sm9iLmpvaW4oKTsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBGb3JjZXMgZGVsaXZlcmluZyBvZiBub3RpZmljYXRpb24gZXZlbnRzLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1ldGhvZCBpcyAiaW5zcGlyZWQiIGJ5IE5vdGlmaWNhdGlvbk1hbmFnZXIncyBub3RpZmljYXRpb24gam9iDQotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdhaXRGb3JOb3RpZmljYXRpb25zKCkNCi0Jew0KLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7DQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgZHVtbXlSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKXsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbg0KLQkJCXsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlmaW5hbCBKb2Igbm90aWZGb3JjaW5nSm9iID0gbmV3IEpvYigiRGVsaXZlcmluZyBub3RpZmljYXRpb25zLi4uIil7DQotDQotCQkJQE92ZXJyaWRlDQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQl3b3Jrc3BhY2UucnVuKGR1bW15UnVubmFibGUsIG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZyggZS5nZXRNZXNzYWdlKCksIGUgKTsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsNCi0JCQl9fTsNCi0JCQ0KLQkJc3luY0V4ZWNKb2Iobm90aWZGb3JjaW5nSm9iLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9ySm9ic1Nsb3coKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCXdhaXRGb3JKb2JzKCk7DQotCQl3YWl0Rm9yRHVtbXlKb2IoSm9iLkRFQ09SQVRFKTsNCi0JCQ0KLQkJd2FpdEZvckV2ZW50TG9vcCgpOw0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvckV2ZW50TG9vcCgpDQotCXsNCi0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOw0KLQkJDQotCQlmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpew0KLQ0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpDQotCQkJew0KLQkJCQkvLyBMZXQgdGhlIGRpc3BsYXkgcHJvY2VzcyB0aGUgZXZlbnRzIGluIGl0cyBxdWV1ZQ0KLQkJCQl3aGlsZShkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKXt9Ow0KLQkJCX19Ow0KLQkJDQotCQlpZihEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKQ0KLQkJew0KLQkJCXJ1bm5hYmxlLnJ1bigpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJew0KLQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOw0KLQkJfQ0KLQkJCQ0KLQl9DQotDQotCS8qKg0KLQkgKiBFeGVjdXRlcyBzeW5jaHJvbm91c2x5IChzY2hlZHVsZXMgYW5kIGpvaW5zKSB0aGUgam9iIHNwZWNpZmllZC48YnI+DQotCSAqIElmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gdGhlIFVJIHRocmVhZCwgdGhlIGpvYiBpcyBzY2hlZHVsZWQgYW5kIGpvaW5lZCBpbiBhIG1vZGFsIGNvbnRleHQgdGhyZWFkIHRodXMgbGV0dGluZyB0aGUgZXZlbnQgbG9vcCBwcm9jZXNzIGFzeW5jaHJvbm91cyBldmVudHM8YnI+DQotCSAqIElmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gYSB3b3JrZXIgdGhyZWFkLCB0aGUgam9iIGlzIHNjaGVkdWxlZCBhbmQgam9pbmVkIGluIHRoZSBjYWxsZXIgdGhyZWFkLg0KLQkgKiANCi0JICogQHBhcmFtIGpvYg0KLQkgKiBAcGFyYW0gZGlzcGxheQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzeW5jRXhlY0pvYihmaW5hbCBKb2Igam9iLCBmaW5hbCBEaXNwbGF5IGRpc3BsYXkpDQotCXsNCi0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKQ0KLQkJew0KLQ0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJam9iLnNjaGVkdWxlKCk7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlqb2Iuam9pbigpOw0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQ0KLQkJCQl7DQotCQkJCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJdHJ5DQotCQl7DQotCQkJVGVzdENvbnRleHQucnVuKHJ1bm5hYmxlLCBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBkaXNwbGF5KTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlsb2dnZXIoKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWxvZ2dlcigpLmxvZ0RlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgSUxvZ2dlciBsb2dnZXIoKQ0KLQl7DQotCQlyZXR1cm4gbmV3IExvZ2dlcigpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9DbGFzc0xvYWRpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvQ2xhc3NMb2FkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYjY0MjAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9DbGFzc0xvYWRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi0vKioKLSAqIEV4dGVuZHMge0BsaW5rIFByb2plY3RCYXNlZFRlc3R9IGJ5IGFkZGluZyBmaW5jdGlvbmFsaXRpZXMgdG8gY3JlYXRlIGNsYXNzZXMgaW4gc29tZSBwYWNrYWdlIGVpZGVyIGJ5IHJlYWRpbmcgaXQgZnJvbSB0ZXh0IGZpbGUgb3IgcGFzc2VkIGFzCi0gKiBzdHJpbmdzLgotICogCi0gKiA8L3ByZT4KLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0xvYWRpbmdUZXN0IGV4dGVuZHMgUHJvamVjdEJhc2VkVGVzdAotewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0VYVCA9ICIuamF2YSI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjaGFyIFNFUEFSQVRPUiA9ICcjJzsKLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50IGRlZmF1bHRQYWNrYWdlOwotCi0JcHVibGljIHZvaWQgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIHNyY0ZvbGRlciwgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWNyZWF0ZUphdmFQcm9qZWN0KHNyY0ZvbGRlcik7Ci0KLQkJaWYgKGRlZmF1bHRQYWNrYWdlTmFtZSAhPSBudWxsKQotCQl7Ci0JCQlkZWZhdWx0UGFja2FnZSA9IGdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChkZWZhdWx0UGFja2FnZU5hbWUsIHRydWUsIG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgY2xhc3MgaW4gdGVzdCBwcm9qZWN0LiA8Y29kZT5zb3VyY2VGaWxlUGF0aDwvY29kZT4gbXVzdCBjb250YWluIHRoZSBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLiBUaGUgY2xhc3MgaXMgY3JlYXRlZCBpbgotCSAqIGRlZmF1bHQgcGFja2FnZS4KLQkgKiAKLQkgKiBQcm9qZWN0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlUGF0aAotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiBAcmV0dXJuIElUeXBlIG9iamVjdCBmb3IgdGhlIGNyZWF0ZWQgY2xhc3MKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY3JlYXRlQ2xhc3MoU3RyaW5nIHNvdXJjZUZpbGVQYXRoLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChzb3VyY2VGaWxlUGF0aCA9PSBudWxsKQotCQl7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInNvdXJjZUZpbGVQYXRoIHNob3VsZCBub3QgYmUgbnVsbC4iKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBUZXN0UHJvamVjdHNVdGlscy5yZWFkU291cmNlKHRoaXMuZ2V0Q2xhc3MoKSwgc291cmNlRmlsZVBhdGgpOwotCi0JCXJldHVybiBjcmVhdGVDbGFzcyhkZWZhdWx0UGFja2FnZSwgY2xhc3NOYW1lLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY2xhc3MgaW4gPGNvZGU+cGNrPC9jb2RlPiBwYWNrYWdlIHdpdGggbmFtZSBhbmQgc291cmNlIDxjb2RlPmNsYXNzTmFtZSwgc291cmNlPC9jb2RlPi4gU291cmNlIG11c3Qgbm90IGluY2x1c2UgcGFja2FnZQotCSAqIGRlY2xhcmF0aW9uLiBQcm9qZWN0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSBwY2sKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW4gY2FzZSBzb21lIG9mIHRoZSBwYXJhbXMgaXMgbnVsbC4KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBjcmVhdGVDbGFzcyhJUGFja2FnZUZyYWdtZW50IHBjaywgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwYXJhbSAnY2xhc3NOYW1lJyBzaG91bGQgbm90IGJlIG51bGwuIik7Ci0JCX0KLQotCQlpZiAoc291cmNlID09IG51bGwpCi0JCXsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigicGFyYW0gJ3NvdXJjZScgc2hvdWxkIG5vdCBiZSBudWxsLiIpOwotCQl9Ci0KLQkJaWYgKGdldFRlc3RQcm9qZWN0KCkgPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9qZWN0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUgY2xhc3NlcyBjYW4gYmUgYWRkZWQgdG8gaXQiKTsKLQkJfQotCi0JCXJldHVybiBnZXRUZXN0UHJvamVjdCgpLmNyZWF0ZVR5cGUocGNrLCBjbGFzc05hbWUgKyBKQVZBX0VYVCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgY29udGVudCBvZiA8Y29kZT5zb3VyY2VzRmlsZVBhdGg8L2NvZGU+IGFuZCBjcmVhdGVzIGNsYXNzZXMgaW4gdGVzdCBwcm9qZWN0LiBUaGUgY29udGVudCBvZiA8Y29kZT5zb3VyY2VzRmlsZVBhdGg8L2NvZGU+IHNvdWxkIGJlIC0KLQkgKiAnIycgY2hhciAoc2VwYXJhdG9yIGZvciBjbGFzc2VzKSBmb2xsb3dlZCBieSBDbGFzcyBuYW1lLCBuZXcgbGluZSBhbmQgYWZ0ZXIgdGhhdCBjbGFzcyBzb3VyY2Ugd2l0aG91dCBwYWNrYWdlIGRlY2xhcmF0aW9uLjxicj4KLQkgKiBFeGFtcGxlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogICNJbXBsZW1lbnRzUmVtb3RlCi0JICogIHB1YmxpYyBjbGFzcyBJbXBsZW1lbnRzUmVtb3RlIGltcGxlbWVudHMgamF2YS5ybWkuUmVtb3RlCi0JICogIHsKLQkgKiAgfQotCSAqIAkKLQkgKiAgI05vRGVmYXVsdENvbnN0cnVjdG9yCi0JICogIHB1YmxpYyBjbGFzcyBOb0RlZmF1bHRDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JICogIHsKLQkgKiAJcHVibGljIE5vRGVmYXVsdENvbnN0cnVjdG9yKFN0cmluZyBwYXJhbSkgewotCSAqICAJfQotCSAqICB9Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGlmIGxvdHMgb2Ygc21hbGwgY2xhc3NlcyBzaG91bGQgYmUgY3JlYXRlZCBmcm9tIGEgc291cmNlIGZpbGUuIFByb2plY3QgbXVzdCBiZSBjcmVhdGVkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZXNGaWxlUGF0aAotCSAqIEByZXR1cm4gbWFwIG9mIGNsYXNzTmFtZS0+SVR5cGUuIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJVHlwZT4gY3JlYXRlQ2xhc3NlcyhTdHJpbmcgc291cmNlc0ZpbGVQYXRoKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlNYXA8U3RyaW5nLCBJVHlwZT4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElUeXBlPigpOwotCQlTdHJpbmcgc291cmNlID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZSh0aGlzLmdldENsYXNzKCksIHNvdXJjZXNGaWxlUGF0aCk7Ci0KLQkJaW50IHN0YXJ0UG9zID0gMDsKLQkJd2hpbGUgKChzdGFydFBvcyA9IHNvdXJjZS5pbmRleE9mKFNFUEFSQVRPUikpID4gLTEpCi0JCXsKLQkJCWludCBlbmRQb3MgPSBzb3VyY2UuaW5kZXhPZihTRVBBUkFUT1IsIHN0YXJ0UG9zICsgMSk7Ci0JCQlpZiAoZW5kUG9zID09IC0xKQotCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKTsKLQotCQkJU3RyaW5nIHNyYyA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnRQb3MgKyAxLCBlbmRQb3MpOwotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOwotCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gc3JjLnN1YnN0cmluZygwLCBzcmMuaW5kZXhPZignXG4nKSkucmVwbGFjZUFsbCgiXHIiLCAiIik7Ci0JCQlzcmMgPSBzcmMuc3Vic3RyaW5nKHNyYy5pbmRleE9mKCdcbicpICsgMSk7Ci0KLQkJCXR5cGVzLnB1dChjbGFzc05hbWUsIGNyZWF0ZUNsYXNzKGRlZmF1bHRQYWNrYWdlLCBjbGFzc05hbWUsIHNyYykpOwotCQl9Ci0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9Qcm9qZWN0QmFzZWRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvUHJvamVjdEJhc2VkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NGUwODk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9Qcm9qZWN0QmFzZWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotDQotLyoqDQotICogR2VuZXJhbCBjbGFzcyBmb3IgdGVzdHMgdGhhdCBzaG91bGQgYmUgc3RhcnRlZCBhcyBKVW5pdCBQbHVnaW4gdGVzdHMuIFByb3ZpZGVzIGJhc2ljIGZ1bmN0aW9uYWxpdGllcyBmb3IgZnVuY3Rpb25hbCB0ZXN0aW5nOiAxLiBDcmVhdGUgSmF2YSBwcm9qZWN0DQotICogaW4ganVuaXQtcnVudGltZS13b3JrYmVuY2guIDIuIENyZWF0ZSBkZWZhdWx0IHNvdXJjZSBmb2xkZXIuIDMuIENyZWF0ZSBkZWZhdWx0IHBhY2thZ2UuDQotICogDQotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0QmFzZWRUZXN0IGV4dGVuZHMgVGVzdENhc2UNCi17DQotCXByaXZhdGUgVGVzdFByb2plY3QgcHJvamVjdDsNCi0NCi0JLyoqDQotCSAqIDxjb2RlPnNyY0ZvbGRlck5hbWU8L2NvZGU+IHRoZSBzb3VyY2UgZm9sZGVyIHdoZXJlIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkLCA8Y29kZT5wYWNrYWdlTmFtZTwvY29kZT4gaXMgdGhlIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyB3aWxsIGJlDQotCSAqIGNyZWF0ZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc3JjRm9sZGVyTmFtZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAtDQotCSAqICAgICAgICAgICAgIGluIGNhc2Ugc3JjRm9sZGVyTmFtZSBpcyBudWxsDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXZhUHJvamVjdChTdHJpbmcgc3JjRm9sZGVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJaWYgKHNyY0ZvbGRlck5hbWUgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInNyY0ZvbGRlck5hbWUgc2hvdWxkIG5vdCBiZSBudWxsLiIpOw0KLQkJfQ0KLQ0KLQkJcHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgpOw0KLQkJcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoc3JjRm9sZGVyTmFtZSk7DQotCX0NCi0NCi0JQE92ZXJyaWRlDQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlpZiAocHJvamVjdCAhPSBudWxsKQ0KLQkJew0KLQkJCXByb2plY3QuZGlzcG9zZSgpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBmaW5hbCBUZXN0UHJvamVjdCBnZXRUZXN0UHJvamVjdCgpDQotCXsNCi0JCXJldHVybiBwcm9qZWN0Ow0KLQl9DQotDQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoKQ0KLQl7DQotCQlyZXR1cm4gcHJvamVjdC5nZXRTb3VyY2VGb2xkZXIoKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKCkNCi0Jew0KLQkJcmV0dXJuIHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdEVqYjNQcm9qZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdEVqYjNQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGEwYTc5YjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy9wcm9qZWN0L1Rlc3RFamIzUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5Db250cmFjdENoZWNrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5leGNlcHRpb24uTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RWpiM1Byb2plY3QNCi17DQotCXByaXZhdGUgSVByb2plY3QgZWpiUHJvamVjdDsNCi0NCi0JcHVibGljIFRlc3RFamIzUHJvamVjdChmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQllamJQcm9qZWN0ID0gY3JlYXRlRWpiTW9kdWxlKG5hbWUgKyAiXyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7DQotCX0NCi0JDQotCXB1YmxpYyBUZXN0RWpiM1Byb2plY3QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJvb2xlYW4gYXBwZW5kVWlkLCBmaW5hbCBib29sZWFuIHJldXNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nQnVpbGRlciBwcm9qZWN0TmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUpOw0KLQkJaWYgKGFwcGVuZFVpZCkNCi0JCXsNCi0JCQlwcm9qZWN0TmFtZS5hcHBlbmQoIl8iKTsNCi0JCQlwcm9qZWN0TmFtZS5hcHBlbmQoTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOw0KLQkJfQ0KLQkJSVByb2plY3QgZXhpc3RpbmdQcm9qZWN0ID0gbnVsbDsNCi0JCWlmIChyZXVzZUV4aXN0aW5nKQ0KLQkJew0KLQkJCWV4aXN0aW5nUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZS50b1N0cmluZygpKTsNCi0JCX0NCi0JCWlmIChleGlzdGluZ1Byb2plY3QgPT0gbnVsbCkNCi0JCXsNCi0JCQl0aGlzLmVqYlByb2plY3QgPSBjcmVhdGVFamJNb2R1bGUocHJvamVjdE5hbWUudG9TdHJpbmcoKSk7DQotCQl9IGVsc2UNCi0JCXsNCi0JCQl0aGlzLmVqYlByb2plY3QgPSBleGlzdGluZ1Byb2plY3Q7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgSVByb2plY3QgY3JlYXRlRWpiTW9kdWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXJldHVybiBUZXN0UHJvamVjdHNVdGlscy5jcmVhdGVFamIzUHJvamVjdChuYW1lKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpDQotCXsNCi0JCXJldHVybiBlamJQcm9qZWN0LmdldFByb2plY3QoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUZvbGRlciBnZXRNZXRhSW5mRm9sZGVyKCkgdGhyb3dzIE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbg0KLQl7DQotCQlyZXR1cm4gZWpiUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJlamJNb2R1bGUiKS5nZXRGb2xkZXIoIk1FVEEtSU5GIik7DQotCX0NCi0NCi0JcHVibGljIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlUGFja2FnZShTdHJpbmcgc291cmNlRm9sZGVyLCBTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7DQotCQlmaW5hbCBJRm9sZGVyIGZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoc291cmNlRm9sZGVyKTsNCi0JCWZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHNyY0ZvbGRlciA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QoZm9sZGVyKTsNCi0JCXJldHVybiBzcmNGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCX0NCi0NCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpbGUoZmluYWwgSUZvbGRlciBmb2xkZXIsIGZpbmFsIFN0cmluZyBmaWxlTmFtZSwgZmluYWwgVVJMIGlucHV0VXJsKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlciwgImZvbGRlciIpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZpbGVOYW1lLCAiZmlsZU5hbWUiKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShpbnB1dFVybCwgImlucHV0VXJsIik7DQotCQkNCi0JCWZpbmFsIElGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShmaWxlTmFtZSk7DQotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlucHV0VXJsLm9wZW5TdHJlYW0oKTsNCi0JCXRyeQ0KLQkJew0KLQkJCWZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQkJcmV0dXJuIGZpbGU7DQotCQl9DQotCQlmaW5hbGx5DQotCQl7DQotCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIFRvIGdldCBhIGhhbmRsZSB0byBhIGZpbGUgbG9jYXRlZCBpbiB0aGlzIHByb2plY3Qgc3BlY2lmaWVkIGJ5IHRoZSByZWxhdGl2ZSBmaWxlIHBhdGguDQotCSAqIEBwYXJhbSBmaWxlUGF0aCBmaWxlIHBhdGggcmVsYXRpdmUgaW5zaWRlIG9mIHRoZSBwcm9qZWN0LCBpLmUuIHRoZSBwcm9qZWN0IG5hbWUgbXVzdCBOT1QNCi0JICogIGJlIHBhcnQgb2YgdGhlIHBhdGggDQotCSAqIEByZXR1cm4gdGhlIGZpbGUgaGFuZGxlICovDQotCXB1YmxpYyBmaW5hbCBJRmlsZSBnZXRGaWxlKGZpbmFsIFN0cmluZyBmaWxlUGF0aCkNCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZpbGVQYXRoLCAiZmlsZVBhdGgiKTsNCi0JCXJldHVybiB0aGlzLmVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoZmlsZVBhdGgpOw0KLQl9DQotDQotCXB1YmxpYyBmaW5hbCB2b2lkIGRlbGV0ZUZpbGUoZmluYWwgSUZvbGRlciBmb2xkZXIsIGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uDQotCXsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmb2xkZXIsICJmb2xkZXIiKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShmaWxlTmFtZSwgImZpbGVOYW1lIik7DQotCQkNCi0JCWZpbmFsIElGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShmaWxlTmFtZSk7DQotCQlpZiAoZmlsZS5leGlzdHMoKSkNCi0JCXsNCi0JCQlmaWxlLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsNCi0JCX0NCi0JfQ0KLQkNCi0JLyoqIFRvIGNyZWF0ZSBhIHByb2plY3QgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgcmVsYXRpdmUgZm9sZGVyIHBhdGguIEFsbCBmb2xkZXIgc2VnbWVudHMNCi0JICogaGF2ZSBhbHJlYWR5IHRvIGV4aXN0IGFwYXJ0IGZyb20gdGhlIGxhc3Qgb25lLCBpLmUuIHBhcmVudCBmb2xkZXJzIGFyZSBub3QgY3JlYXRlZCBhdXRvbWF0aWNhbGx5Lg0KLQkgKiBAcGFyYW0gZm9sZGVyUGF0aCBmb2xkZXIgcGF0aCByZWxhdGl2ZSBpbnNpZGUgb2YgdGhlIHByb2plY3QsIGkuZS4gdGhlIHByb2plY3QgbmFtZSBtdXN0IE5PVA0KLQkgKiAgYmUgcGFydCBvZiB0aGUgcGF0aCANCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBmb2xkZXINCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uICovDQotCXB1YmxpYyBmaW5hbCBJRm9sZGVyIGNyZWF0ZUZvbGRlcihmaW5hbCBTdHJpbmcgZm9sZGVyUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0Jew0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlclBhdGgsICJmb2xkZXJQYXRoIik7DQotCQkNCi0JCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gdGhpcy5lamJQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoZm9sZGVyUGF0aCk7DQotCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOw0KLQkJcmV0dXJuIGZvbGRlcjsNCi0JfQ0KLQ0KLQkvKiogVG8gZ2V0IGEgaGFuZGxlIHRvIGEgcHJvamVjdCBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSByZWxhdGl2ZSBmb2xkZXIgcGF0aC4NCi0JICogQHBhcmFtIGZvbGRlclBhdGggZm9sZGVyIHBhdGggcmVsYXRpdmUgaW5zaWRlIG9mIHRoZSBwcm9qZWN0LCBpLmUuIHRoZSBwcm9qZWN0IG5hbWUgbXVzdCBOT1QNCi0JICogIGJlIHBhcnQgb2YgdGhlIHBhdGggDQotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBoYW5kbGUgKi8NCi0JcHVibGljIGZpbmFsIElGb2xkZXIgZ2V0Rm9sZGVyKGZpbmFsIFN0cmluZyBmb2xkZXJQYXRoKQ0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0oZm9sZGVyUGF0aCwgImZvbGRlclBhdGgiKTsNCi0JCXJldHVybiB0aGlzLmVqYlByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihmb2xkZXJQYXRoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MzAwZDE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLldvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlLnV0aWwuQXB0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam9icy5Kb2JVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnRocmVhZGluZy5UZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuQ29udHJhY3RDaGVja2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogV3JhcHBlciB1dGlsaXR5IGZvciBtYWludGFpbmluZyBwcm9qZWN0cyB3aGljaCBwYXJ0aWNpcGF0ZSBpbiB0ZXN0cyBmaXh0dXJlLiBSZXNvdXJjZSBtb2RpZmljYXRpb24gb3BlcmF0aW9ucyBhcmUgYWx3YXlzIHBlcmZvcm1lZCBvdXRzaWRlIHRoZSBVSSAobWFpbiB0aHJlYWQpLiBJZiB0aGUgY2FsbGVyIHRocmVhZCBpcyB0aGUgVUkgdGhyZWFkLCBmb3JrIGluIHtAbGluayBUZXN0Q29udGV4dH0gaXMgcGVyZm9ybWVkLgotICogUmVzb3VyY2UgY2hhbmdlIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoaW4gYSB7QGxpbmsgSVdvcmtzcGFjZVJ1bm5hYmxlfSB3aXRoIGEgc2NoZWR1bGluZyBydWxlIG9mIHRoZSB3b3Jrc3BhY2Ugcm9vdDxicj4KLSAqIEV4ZWN1dGluZyByZXNvdXJjZSBjaGFuZ2VzIG91dHNpZGUgdGhlIFVJIHRocmVhZCBhbGxvd3MgcmVzb3VyY2UgY2hhbmdlIGV2ZW50cyBwcm9wYWdhdGlvbiBldmVudCB3aGVuIHRoZSBKVW5pdCB0ZXN0cyBydW4gaW4gdGhlIFVJIHRocmVhZC4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgV2ViIHNlcnZpY2UgRE9NIHRlc3RzIGFzIHRoZSBtb2RlbCBpcyB1cGRhdGVkIG9uIHJlc291cmNlIGNoYW5nZXMgICAKLSAqIAotICogQGF1dGhvciBHZW9yZ2kgVmFjaGtvdiwgRGFuYWlsIEJyYW5la292Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgVGVzdFByb2plY3QKLXsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGNoYXIgQ0xBU1NfU0VQQVJBVE9SID0gJyMnOwotCQotCXByaXZhdGUgaW50IGlkSW5NaWxsaXMgPSAwOwotCQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXI7Ci0KLQlwdWJsaWMgVGVzdFByb2plY3QoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJdGhpcygiIik7Ci0JfQotCQotCXB1YmxpYyBUZXN0UHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCS8qCi0JCSAqIENhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwcm9qZWN0LiBUaGUgZm9ybXVsYTogSmF2YVByb2pfICsgPGN1cnJlbnRfdGltZV9pbl9taWxsaXM/ICsgPGlkSW5NaWxsaXM+IGlzIHVzc2VkLiBJbiB0aGlzIGZvcm11bGEKLQkJICogSmF2YVByb2pfIGlzIGEgc3RyaW5nIGxpdHRlcmFsLCBjdXJyZW50X3RpbWVfaW5fbWlsbGlzIGlzIG9idmlvdXMuIGlkSW5NaWxsaXMgaXMgYW4gaW50ZWdlciBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBwcm9qZWN0IG5hbWUgaXMKLQkJICogY2FsY3VsYXRlZC4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgc3lzdGVtIHRpbWVyIGhhcyBwcmVjaXNpb24gYWJvdXQgMTAgbXMuIFRodXMgaXQncyBwb3NzaWJsZSB0aGF0IHR3byBjb25zZWN1dGl2ZSBwcm9qZWN0IGNyZWF0aW9ucwotCQkgKiBnaXZlIHRoZSBzYW1lIHByb2plY3QgbmFtZS4gRm9yIGV4YW1wbGUgdGhlIHByb2plY3QgaXMgY3JldGVkIHRoZW4gdGhlIHRlc3QgZXhlY3V0ZXMgdmVyeSBmYXN0IGFuZCBhIG5ldyBwcm9qZWN0IGlzIGNyZWF0ZWQgYWdhaW4uIEluIHRoZQotCQkgKiBzYW1lIHRpbWUgc2ltcGx5IHRoZSBpZCBpcyBub3QgZW5vdWdoIGFzIGEgZGlmZmVyZW50IHRlc3QgcnVuIG1pZ2h0IHByb2R1Y2UgdGhlIHNhbWUgcHJvamVjdCBuYW1lLiBUaHVzIHRoZSBjb21iaW5hdGlvbiB0aW1fbWlsbGlzICsKLQkJICogaWRJbk1pbGxpcyBnaXZlcyBhIHVuaXF1ZSBwcm9qZWN0IG5hbWUKLQkJICovCi0JCWZpbmFsIFN0cmluZyB0ZXN0UHJvamVjdE5hbWUgPSAiSmF2YVByb2pfIiArIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpICsgIl8iICsgaWRJbk1pbGxpcysrICsgbmFtZTsKLQkJcHJvamVjdCA9IHdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCQotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlUHJvamVjdE9wZXJhdGlvbiA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQotCQkJCWNvbmZpZ3VyZUphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoY3JlYXRlUHJvamVjdE9wZXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUphdmFQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCi0JCUlGb2xkZXIgYmluRm9sZGVyID0gY3JlYXRlQmluRm9sZGVyKCk7Ci0KLQkJc2V0SmF2YU5hdHVyZSgpOwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3IElDbGFzc3BhdGhFbnRyeVswXSwgbnVsbCk7Ci0KLQkJY3JlYXRlT3V0cHV0Rm9sZGVyKGJpbkZvbGRlcik7Ci0JCWFkZFN5c3RlbUxpYnJhcmllcygpOwotCX0KLQotCXB1YmxpYyBUZXN0UHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJwcm9qZWN0IHNob3VsZCBub3QgYmUgbnVsbCIpOwotCQl9Ci0KLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSBmaW5kU291cmNlRm9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBmaW5kU291cmNlRm9sZGVyKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpKQotCQl7Ci0JCQlpZiAocGZyLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkKLQkJCXsKLQkJCQlyZXR1cm4gcGZyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKQotCXsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpCi0JewotCQlyZXR1cm4gamF2YVByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBwbHVnaW4sIFN0cmluZyBqYXIpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uCi0JewotCQlQYXRoIHJlc3VsdCA9IGZpbmRGaWxlSW5QbHVnaW4ocGx1Z2luLCBqYXIpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgb2xkRW50cmllcy5sZW5ndGgpOwotCQluZXdFbnRyaWVzW29sZEVudHJpZXMubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShyZXN1bHQsIG51bGwsIG51bGwpOwotCQkKLQkJc2V0Q2xhc3NwYXRoKG5ld0VudHJpZXMpOwotCX0KLQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2UoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50W10gY3JlYXRlZFBhY2thZ2UgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFsxXTsKLQkJCi0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGVQYWNrYWdlUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlpZiAoc291cmNlRm9sZGVyID09IG51bGwpCi0JCQkJCXNvdXJjZUZvbGRlciA9IGNyZWF0ZVNvdXJjZUZvbGRlcigic3JjIik7Ci0JCQkJY3JlYXRlZFBhY2thZ2VbMF0gPSBzb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KG5hbWUsIGZhbHNlLCBudWxsKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZVBhY2thZ2VSdW5uYWJsZSk7Ci0JCQotCQlyZXR1cm4gY3JlYXRlZFBhY2thZ2VbMF07Ci0JfQotCi0JcHVibGljIElUeXBlIGNyZWF0ZVR5cGUoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrLCBmaW5hbCBTdHJpbmcgY3VOYW1lLCBmaW5hbCBTdHJpbmcgc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgicGFja2FnZSAiICsgcGFjay5nZXRFbGVtZW50TmFtZSgpICsgIjtcbiIpOwotCQlidWYuYXBwZW5kKCJcbiIpOwotCQlidWYuYXBwZW5kKHNvdXJjZSk7Ci0JCQotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0W10gY3JlYXRlZEN1ID0gbmV3IElDb21waWxhdGlvblVuaXRbMV07Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGVDdVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJY3JlYXRlZEN1WzBdID0gcGFjay5jcmVhdGVDb21waWxhdGlvblVuaXQoY3VOYW1lLCBidWYudG9TdHJpbmcoKSwgZmFsc2UsIG51bGwpOwotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoY3JlYXRlQ3VSdW5uYWJsZSk7Ci0JCQotCQlyZXR1cm4gY3JlYXRlZEN1WzBdLmdldFR5cGVzKClbMF07Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBtdWx0aXBsZSBjbGFzc2VzIGluIHByb2plY3QuIFRoZSBjb250ZW50IG9mIDxjb2RlPnNvdXJjZTwvY29kZT4gc2hvdWxkIGJlIGluIGZvcm0gLQotCSAqICcjJyBjaGFyIChzZXBhcmF0b3IgZm9yIGNsYXNzZXMpIGZvbGxvd2VkIGJ5IENsYXNzIG5hbWUsIG5ldyBsaW5lIGFuZCBhZnRlciB0aGF0IGNsYXNzIHNvdXJjZSB3aXRob3V0IHBhY2thZ2UgZGVjbGFyYXRpb24uPGJyPgotCSAqIEV4YW1wbGU6Ci0JICogCi0JICogPHByZT4KLQkgKiAgI0ltcGxlbWVudHNSZW1vdGUKLQkgKiAgcHVibGljIGNsYXNzIEltcGxlbWVudHNSZW1vdGUgaW1wbGVtZW50cyBqYXZhLnJtaS5SZW1vdGUKLQkgKiAgewotCSAqICB9Ci0JICogCQotCSAqICAjTm9EZWZhdWx0Q29uc3RydWN0b3IKLQkgKiAgcHVibGljIGNsYXNzIE5vRGVmYXVsdENvbnN0cnVjdG9yIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLQkgKiAgewotCSAqIAlwdWJsaWMgTm9EZWZhdWx0Q29uc3RydWN0b3IoU3RyaW5nIHBhcmFtKSB7Ci0JICogIAl9Ci0JICogIH0KLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgbG90cyBvZiBzbWFsbCBjbGFzc2VzIHNob3VsZCBiZSBjcmVhdGVkIGZyb20gYSBzb3VyY2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlc0ZpbGVQYXRoCi0JICogQHJldHVybiBtYXAgb2YgY2xhc3NOYW1lLT5JVHlwZS4gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIElUeXBlPiBjcmVhdGVUeXBlcyhJUGFja2FnZUZyYWdtZW50IHBhY2ssIFN0cmluZyBzb3VyY2UpIHRocm93cyBFeGNlcHRpb24KLQl7Ci0JCU1hcDxTdHJpbmcsIElUeXBlPiB0eXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVR5cGU+KCk7Ci0JCWludCBzdGFydFBvcyA9IDA7Ci0JCXdoaWxlICgoc3RhcnRQb3MgPSBzb3VyY2UuaW5kZXhPZihDTEFTU19TRVBBUkFUT1IpKSA+IC0xKQotCQl7Ci0JCQlpbnQgZW5kUG9zID0gc291cmNlLmluZGV4T2YoQ0xBU1NfU0VQQVJBVE9SLCBzdGFydFBvcyArIDEpOwotCQkJaWYgKGVuZFBvcyA9PSAtMSkgewotCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJCX0KLQotCQkJU3RyaW5nIHNyYyA9IHNvdXJjZS5zdWJzdHJpbmcoc3RhcnRQb3MgKyAxLCBlbmRQb3MpOwotCQkJc291cmNlID0gc291cmNlLnN1YnN0cmluZyhlbmRQb3MpOwotCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gc3JjLnN1YnN0cmluZygwLCBzcmMuaW5kZXhPZignXG4nKSkucmVwbGFjZUFsbCgiXHIiLCAiIikudHJpbSgpOwotCQkJc3JjID0gc3JjLnN1YnN0cmluZyhzcmMuaW5kZXhPZignXG4nKSArIDEpOwotCi0JCQl0eXBlcy5wdXQoY2xhc3NOYW1lLCBjcmVhdGVUeXBlKHBhY2ssIGNsYXNzTmFtZSArICIuamF2YSIsIHNyYykpOwotCQl9Ci0KLQkJcmV0dXJuIHR5cGVzOwotCX0JCQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBkaXNwb3NlUHJvamVjdFJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoUmVzb3VyY2VFeGNlcHRpb24gcmUpIHsKLQkJCQkJLyoKLQkJCQkJICogc2lsZW50bHkgc3dhbGxvdyB0aGUgcmVzb3VyY2UgZXhjZXB0aW9uLiBGb3Igc29tZSByZWFzb24gdGhpcyBleGNlcHRpb24gZ2V0cyB0aHJvd24KLQkJCQkJICogZnJvbSB0aW1lIHRvIHRpbWUgYW5kIHJlcG9ydHMgdGhlIHRlc3QgZmFpbGluZy4gVGhlIHByb2plY3QgZGVsZXRpb24gaXRzZWxmIGhhcHBlbnMKLQkJCQkJICogYWZ0ZXIgdGhlIHRlc3QgaGFzIGNvbXBsZXRlZCBhbmQgYSBmYWlsdXJlIHdpbGwgbm90IHJlcG9ydCBhIHByb2JsZW0gaW4gdGhlIHRlc3QuCi0JCQkgICAgCSAqIE9ubHkgUmVzb3VyY2VFeGNlcHRpb24gaXMgY2F1Z2h0IGluIG9yZGVyIG5vdCB0byBoaWRlIHVuZXhwZWN0ZWQgZXJyb3JzLgkKLQkJCQkJICovCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShkaXNwb3NlUHJvamVjdFJ1bm5hYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJCi0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBjbG9zZVJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsJCQotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoY2xvc2VSdW5uYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJRm9sZGVyIGNyZWF0ZUJpbkZvbGRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJRm9sZGVyIGJpbkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCJiaW4iKTsKLQkJYmluRm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCXJldHVybiBiaW5Gb2xkZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFOYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXSB7IEphdmFDb3JlLk5BVFVSRV9JRCB9KTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU91dHB1dEZvbGRlcihJRm9sZGVyIGJpbkZvbGRlcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBiaW5Gb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJamF2YVByb2plY3Quc2V0T3V0cHV0TG9jYXRpb24ob3V0cHV0TG9jYXRpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBjcmVhdGVTb3VyY2VGb2xkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGNyZWF0ZWRSb290ID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzFdOwotCQlmaW5hbCBJV29ya3NwYWNlUnVubmFibGUgY3JlYXRlUm9vdFJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKG5hbWUpOwotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJCWNyZWF0ZWRSb290WzBdID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChmb2xkZXIpOwotCi0JCQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0VudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29sZEVudHJpZXMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShvbGRFbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBvbGRFbnRyaWVzLmxlbmd0aCk7Ci0JCQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShjcmVhdGVkUm9vdFswXS5nZXRQYXRoKCkpOwotCQkJCXNldENsYXNzcGF0aChuZXdFbnRyaWVzKTsKLQkJCX0KLQkJfTsKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGNyZWF0ZVJvb3RSdW5uYWJsZSk7Ci0JCXRoaXMuc291cmNlRm9sZGVyID0gY3JlYXRlZFJvb3RbMF07Ci0JCQotCQlyZXR1cm4gc291cmNlRm9sZGVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTeXN0ZW1MaWJyYXJpZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKTsKLQkJc2V0Q2xhc3NwYXRoKG5ld0VudHJpZXMpOwotCX0KLQotCXByaXZhdGUgUGF0aCBmaW5kRmlsZUluUGx1Z2luKFN0cmluZyBwbHVnaW4sIFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCXsKLQkJQnVuZGxlIHBsdWdpbkJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW4pOwotCQlVUkwgamFyVVJMID0gbmV3IFVSTChwbHVnaW5CdW5kbGUuZ2V0RW50cnkoIi8iKSwgZmlsZSk7Ci0JCVVSTCBsb2NhbEphclVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChqYXJVUkwpOwotCQlyZXR1cm4gbmV3IFBhdGgobG9jYWxKYXJVUkwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKCkKLQl7Ci0JCXJldHVybiBzb3VyY2VGb2xkZXI7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5lciBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QsIGkuZS4gdGhlIHNvdXJjZSBmb2xkZXIuPGJyPgotCSAqIElmIHRoaXMgcHJvamVjdCBpcyBhIGphci96aXAgKGlmIHRoaXMgaXMgcG9zc2libGUgYXQgYWxsKSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldFNvdXJjZUZvbGRlckNvbnRhaW5lcigpCi0JewotCQl0cnl7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0U291cmNlRm9sZGVyKCkuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCQlpZihyZXM9PW51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX1lbHNlIHsKLQkJCQlJQ29udGFpbmVyIHJldFZhbCA9IChJQ29udGFpbmVyKSByZXM7Ci0JCQkJcmV0dXJuIHJldFZhbDsKLQkJCX0KLQkJfWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX1jYXRjaChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElGb2xkZXIgY3JlYXRlRm9sZGVyKGZpbmFsIFN0cmluZyBmb2xkZXJOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKGZvbGRlck5hbWUsICJmb2xkZXJOYW1lIik7Ci0JCWZpbmFsIElGb2xkZXIgZm9sZGVyID0gdGhpcy5wcm9qZWN0LmdldEZvbGRlcihmb2xkZXJOYW1lKTsKLQkJZmluYWwgSVdvcmtzcGFjZVJ1bm5hYmxlIGNyZWF0ZUZvbGRlclJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShjcmVhdGVGb2xkZXJSdW5uYWJsZSk7Ci0JCQotCQlyZXR1cm4gZm9sZGVyOwkJCi0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgcHJvamVjdCByb290IGFzIHNvdXJjZSBmb2xkZXIKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NpZ25Qcm9qZWN0Um9vdEFzU291cmNlRm9sZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCUlDbGFzc3BhdGhFbnRyeSBkZWZhdWx0U3JjRm9sZGVyRW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShwcm9qZWN0LmdldEZ1bGxQYXRoKCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRDcCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDcCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkQ3AubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkob2xkQ3AsIDAsIG5ld0NwLCAwLCBvbGRDcC5sZW5ndGgpOwotCQluZXdDcFtuZXdDcC5sZW5ndGggLSAxXSA9IGRlZmF1bHRTcmNGb2xkZXJFbnRyeTsKLQkJCi0JCXNldENsYXNzcGF0aChuZXdDcCk7Ci0JCXRoaXMuc291cmNlRm9sZGVyID0gIFRlc3RQcm9qZWN0c1V0aWxzLmdldFNvdXJjZUZvbGRlcihwcm9qZWN0LCAiIik7Ci0JfQotCQotCXByaXZhdGUgSVdvcmtzcGFjZSB3b3Jrc3BhY2UoKQotCXsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoKGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBzZXRDbGFzc3BhdGhSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKQotCQl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoc2V0Q2xhc3NwYXRoUnVubmFibGUpOwotCQkKLQkJU3RyaW5nIGxvZyA9ICJcbiIramF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSsiXG4iK1N0cmluZy52YWx1ZU9mKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aCkrIlxuIjsgCi0KLQkJZm9yKGludCBpaT0wOyBpaSA8IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLmxlbmd0aDsgaWkrKykKLQkJewotCQkJbG9nID0gbG9nICsgIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpW2lpXS5nZXRQYXRoKCkudG9TdHJpbmcoKSsiXG4iOwotCQl9Ci0JCQotCQlpZihqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKS5sZW5ndGg9PTApCi0JCXsKLQkJCWxvZyA9IGxvZyArICJDbGFzc3BhdGggbm90IGluaXRpYWxpemVkICFcbiI7Ci0JCX0KLQkJCi0JCVJlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2cobmV3IFN0YXR1cygwLCJ0ZXN0T3V0cHV0Iixsb2cpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXB0UHJvY2Vzc2luZ0VuYWJsZWQoZmluYWwgYm9vbGVhbiBlbmFibGVkLCBmaW5hbCBib29sZWFuIGVuYWJsZVJlY29uY2lsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBzZXRQcm9jZXNzaW5nUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCQkJewotCQkJCUFwdENvbmZpZy5zZXRFbmFibGVkKFRlc3RQcm9qZWN0LnRoaXMuamF2YVByb2plY3QsIGVuYWJsZWQpOwotCQkJCUFwdENvbmZpZy5zZXRQcm9jZXNzRHVyaW5nUmVjb25jaWxlKFRlc3RQcm9qZWN0LnRoaXMuamF2YVByb2plY3QsIGVuYWJsZVJlY29uY2lsZSk7Ci0JCQkJVGVzdFByb2plY3QudGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JCQotCQlUZXN0UHJvamVjdHNVdGlscy5leGVjdXRlV29ya3NwYWNlUnVubmFibGUoc2V0UHJvY2Vzc2luZ1J1bm5hYmxlKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGRzIGEgcHJvamVjdAotCSAqIEBwYXJhbSBraW5kIGJ1aWxkIGtpbmQuIFNlZSB7QGxpbmsgSVByb2plY3QjYnVpbGQoaW50LCBJUHJvZ3Jlc3NNb25pdG9yKX0gZm9yIGRldGFpbHMKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBidWlsZChmaW5hbCBpbnQga2luZCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBidWlsZFJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpCi0JCXsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCQl7Ci0JCQkJVGVzdFByb2plY3QudGhpcy5wcm9qZWN0LmJ1aWxkKGtpbmQsIG1vbml0b3IpOwotCQkJfQotCQl9OwotCQkKLQkJVGVzdFByb2plY3RzVXRpbHMuZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGJ1aWxkUnVubmFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSByZWZyZXNoUnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQkJCXsKLQkJCQlUZXN0UHJvamVjdC50aGlzLmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQkJCi0JCVRlc3RQcm9qZWN0c1V0aWxzLmV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShyZWZyZXNoUnVubmFibGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdGVzdHV0aWxzL3Byb2plY3QvVGVzdFByb2plY3RzVXRpbHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdHNVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZjI0NDc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvcHJvamVjdC9UZXN0UHJvamVjdHNVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlR5cGVOYW1lUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmpvYnMuSm9iVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy50aHJlYWRpbmcuVGVzdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIFRlc3RQcm9qZWN0c1V0aWxzCi17Ci0JLyoqCi0JICogUmVhZHMgY29udGVudCBvZiB0ZXh0IGZpbGUgYW5kIHJldHVybnMgaXQgYXMgU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzcyBjb250ZXh0Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTb3VyY2UoQ2xhc3M8Pz4gY2xhc3NDb250ZXh0LCBTdHJpbmcgZmlsZVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNsYXNzQ29udGV4dC5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVQYXRoKSk7Ci0JCXRyeQotCQl7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQljaGFyW10gYnVmZiA9IG5ldyBjaGFyWzUxMl07Ci0KLQkJCWludCBsZW4gPSAwOwotCQkJd2hpbGUgKChsZW4gPSBpc3IucmVhZChidWZmKSkgPiAwKQotCQkJewotCQkJCXNiLmFwcGVuZChTdHJpbmcudmFsdWVPZihidWZmLCAwLCBsZW4pKTsKLQkJCX0KLQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0KLQkJfSBmaW5hbGx5Ci0JCXsKLQkJCWlzci5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RhcnRzIGFuIGluZGV4ZXIgam9iLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHdvcmtiZW5jaCByZWZyZXNoL2J1aWxkIHByb2Nlc3NlcyBhcmUgb3ZlciAKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9ySW5kZXhlcigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCW5ldyBTZWFyY2hFbmdpbmUoKS5zZWFyY2hBbGxUeXBlTmFtZXMobnVsbCwgU2VhcmNoUGF0dGVybi5SX0VYQUNUX01BVENILCAKLQkJCQkJCQkJCQkJICBudWxsLCBTZWFyY2hQYXR0ZXJuLlJfQ0FTRV9TRU5TSVRJVkUsIAotCQkJCQkJCQkJCQkgIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTLCAKLQkJCQkJCQkJCQkJICBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKG5ldyBJSmF2YUVsZW1lbnRbMF0pLCBuZXcgVHlwZU5hbWVSZXF1ZXN0b3IoKQotCQkJCQkJCQkJCQkgIHsKLQkJCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0Q2xhc3MoY2hhcltdIHBhY2thZ2VOYW1lLCBjaGFyW10gc2ltcGxlVHlwZU5hbWUsIGNoYXJbXVtdIGVuY2xvc2luZ1R5cGVOYW1lcywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJU3RyaW5nIHBhdGgpCi0JCQkJCQkJCQkJCQkJewotCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCQkJCQkJCQkJCQkJcHVibGljIHZvaWQgYWNjZXB0SW50ZXJmYWNlKGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCVN0cmluZyBwYXRoKQotCQkJCQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCSAgfSwKLQkJCQkJCQkJCQkJICBJSmF2YVNlYXJjaENvbnN0YW50cy5XQUlUX1VOVElMX1JFQURZX1RPX1NFQVJDSCwgbnVsbCk7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcHJvamVjdC5jcmVhdGUobnVsbCk7Ci0JCXByb2plY3Qub3BlbihudWxsKTsKLQkJSm9iVXRpbHMud2FpdEZvckluZGV4ZXIoKTsKLQkJCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXcgU3RyaW5nW10geyBKYXZhQ29yZS5OQVRVUkVfSUQgfSk7Ci0JCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQlJSmF2YVByb2plY3QgamF2YVAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWFkZFRvQ2xhc3NwYXRoKGphdmFQLCBKYXZhUnVudGltZS5nZXREZWZhdWx0SlJFQ29udGFpbmVyRW50cnkoKSk7Ci0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdFbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVtvbGRFbnRyaWVzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIG9sZEVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tvbGRFbnRyaWVzLmxlbmd0aF0gPSBjcEVudHJ5OwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQl7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJZm9yKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKQotCQl7Ci0JCQlpZihyb290LmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGZvbGRlck5hbWUpKQotCQkJewotCQkJCXJldHVybiByb290OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBjcmVhdGVTb3VyY2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlpZihnZXRTb3VyY2VGb2xkZXIocHJvamVjdCwgZm9sZGVyTmFtZSkgIT0gbnVsbCkKLQkJewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU291cmNlIGZvbGRlciBhbHJlYWR5IGV4aXN0czogIiArIGZvbGRlck5hbWUpOwotCQl9Ci0KLQkJSUZvbGRlciBzcmNGb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihmb2xkZXJOYW1lKTsKLQkJc3JjRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJSUNsYXNzcGF0aEVudHJ5IHNyY0NwRW50cnkgPSBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzcmNGb2xkZXIuZ2V0RnVsbFBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG9sZEVudHJpZXMgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3RW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbb2xkRW50cmllcy5sZW5ndGggKyAxXTsgCi0JCVN5c3RlbS5hcnJheWNvcHkob2xkRW50cmllcywgMCwgbmV3RW50cmllcywgMCwgb2xkRW50cmllcy5sZW5ndGgpOwotCQluZXdFbnRyaWVzW25ld0VudHJpZXMubGVuZ3RoIC0gMV0gPSBzcmNDcEVudHJ5OwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbnVsbCk7Ci0KLQkJcmV0dXJuIGdldFNvdXJjZUZvbGRlcihwcm9qZWN0LCBmb2xkZXJOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnRzIGEgZmlsZSBpbnRvIGEgcHJvamVjdAotCSAqIEBwYXJhbSBjbGFzc0NvbnRleHQgdGhlIGNsYXNzIHdoaWNoIGNsYXNzbG9hZGVyIGlzIHVzZWQgdG8gZ2V0IHRoZSBzb3VyY2UgcmVzb3VyY2UgCi0JICogQHBhcmFtIHJlbGF0aXZlU3JjRmlsZUxvY2F0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5jbGFzc0NvbnRleHQ8L2NvZGU+IHBhcmFtZXRlcgotCSAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSB0aGUgdGFyZ2V0IHJlc291cmNlOyAKLQkgKiBAcGFyYW0gdGFyZ2V0RmlsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgY3JlYXRlZAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAcmV0dXJucyB0aGUgZmlsZSBpbXBvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBpbXBvcnRGaWxlSW50b1Byb2plY3QoQ2xhc3M8Pz4gY2xhc3NDb250ZXh0LCBTdHJpbmcgcmVsYXRpdmVTcmNGaWxlTG9jYXRpb24sIElDb250YWluZXIgdGFyZ2V0UmVzb3VyY2UsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgc3JjID0gVGVzdFByb2plY3RzVXRpbHMucmVhZFNvdXJjZShjbGFzc0NvbnRleHQsIHJlbGF0aXZlU3JjRmlsZUxvY2F0aW9uKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUodGFyZ2V0UmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkgKyAiXFwiICsgdGFyZ2V0RmlsZU5hbWUpOwotCQkKLQkJaWYoZi5leGlzdHMoKSkKLQkJewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmlsZSBhbHJlYWR5IGV4aXN0czogIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCQotCQlpZihmLmlzRGlyZWN0b3J5KCkpCi0JCXsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZi5nZXRBYnNvbHV0ZVBhdGgoKSArICIgaXMgYSBkaXJlY3RvcnkiKTsKLQkJfQotCQlpZiggZi5jcmVhdGVOZXdGaWxlKCkgKQotCQl7Ci0JCQlCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkpOwotCQkJb3V0LndyaXRlKHNyYyk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVdvcmtzcGFjZVByb2plY3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJSm9iVXRpbHMud2FpdEZvckpvYnMoKTsKLQkJZm9yKElQcm9qZWN0IHByb2plY3QgOiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCXByb2plY3QuZGVsZXRlKGZhbHNlLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQkobmV3IExvZ2dlcigpKS5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlKb2JVdGlscy53YWl0Rm9ySm9icygpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVFamIzUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0JewotCQlmaW5hbCBJUHJvamVjdCBlamJQcm9qZWN0ID0gY3JlYXRlUHJvamVjdFdpdGhGYWNldChwcm9qZWN0TmFtZSwgbmV3IFN0cmluZ1tdeyJqc3QuamF2YSIsICJqc3QuZWpiIn0sIG5ldyBTdHJpbmdbXXsiNS4wIiwgIjMuMCJ9KTsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQID0gSmF2YUNvcmUuY3JlYXRlKGVqYlByb2plY3QpOwotCQkKLQkJcmVtb3ZlQWxsU291cmNlRm9sZGVycyhqYXZhUCk7Ci0KLQkJLy8gU2V0IGVqYk1vZHVsZSBmb2xkZXIgKGNyZWF0ZWQgZHVyaW5nIGpzdC5lamIgZmFjZXQgaW5zdGFsbGF0aW9uKSBhcyBzb3VyY2UgZm9sZGVyCi0JCWZpbmFsIElGb2xkZXIgc3JjRm9sZGVyID0gZWpiUHJvamVjdC5nZXRGb2xkZXIoImVqYk1vZHVsZSIpOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZWpiTW9kdWxlQ3BFbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNyY0ZvbGRlci5nZXRGdWxsUGF0aCgpLm1ha2VBYnNvbHV0ZSgpKTsKLQkJYWRkVG9DbGFzc3BhdGgoSmF2YUNvcmUuY3JlYXRlKGVqYlByb2plY3QpLCBlamJNb2R1bGVDcEVudHJ5KTsKLQkJCi0JCXJldHVybiBlamJQcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNvdXJjZUZvbGRlcnMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JewotCQlmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbmV3Q2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWZvcihJQ2xhc3NwYXRoRW50cnkgY3BFbnRyeSA6IGphdmFQLmdldFJhd0NsYXNzcGF0aCgpKQotCQl7Ci0JCQlpZihjcEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKQotCQkJewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbmV3Q2xhc3NwYXRoLmFkZChjcEVudHJ5KTsKLQkJfQotCQlqYXZhUC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtuZXdDbGFzc3BhdGguc2l6ZSgpXSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0V2l0aEZhY2V0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgZmluYWwgU3RyaW5nW10gZmFjZXRJZCwgZmluYWwgU3RyaW5nW10gZmFjZXRWZXJzaW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJYXNzZXJ0IGZhY2V0SWQubGVuZ3RoID09IGZhY2V0VmVyc2lvbi5sZW5ndGg7Ci0JCWZpbmFsIElQcm9qZWN0W10gcmVzdWx0ID0gbmV3IElQcm9qZWN0WzFdOwotCQl0cnkKLQkJewotCQkJVGVzdENvbnRleHQucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQl7Ci0JCQkJCXRyeQotCQkJCQl7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQkJCQlmaW5hbCBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocmVzdWx0WzBdLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmYWNldElkLmxlbmd0aDsgaSsrKQotCQkJCQkJewotCQkJCQkJCWZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZmFjZXRJZFtpXSk7Ci0JCQkJCQkJZmFjZXRlZFByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChmYWNldC5nZXRWZXJzaW9uKGZhY2V0VmVyc2lvbltpXSksIG51bGwsIG1vbml0b3IpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQkJewotCQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9fSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpCi0JCXsKLQkJCWlmKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pCi0JCQl7Ci0JCQkJdGhyb3cgKENvcmVFeGNlcHRpb24pZS5nZXRDYXVzZSgpOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0JCXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkeW5hbWljIHdlYiBtb2R1bGUgcHJvamVjdCB3aXRoICJqc3Qud2ViIiBmYWNldCB2ZXIuIDIuNSBpbnN0YWxsZWQKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVXZWIyNVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJZmluYWwgSVByb2plY3Qgd2ViUHJvamVjdCA9IGNyZWF0ZVByb2plY3RXaXRoRmFjZXQocHJvamVjdE5hbWUsIG5ldyBTdHJpbmdbXXsianN0LmphdmEiLCAianN0LndlYiJ9LCBuZXcgU3RyaW5nW117IjUuMCIsICIyLjUifSk7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUCA9IEphdmFDb3JlLmNyZWF0ZSh3ZWJQcm9qZWN0KTsKLQotCQlyZW1vdmVBbGxTb3VyY2VGb2xkZXJzKGphdmFQKTsKLQotCQlyZXR1cm4gd2ViUHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgYSB3b3Jrc3BhY2UgcnVubmFibGUgb3V0c2lkZSB0aGUgbWFpbiB0aHJlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWV4ZWN1dGVXb3Jrc3BhY2VSdW5uYWJsZShydW5uYWJsZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZXhlY3V0ZVdvcmtzcGFjZVJ1bm5hYmxlKGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJaWYoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkKLQkJewotCQkJLy8gRXhlY3V0ZSB0aGUgcnVubmFibGUgaW4gdGhlIGN1cnJlbnQgKG5vbi1VSSkgdGhyZWFkCi0JCQl3b3Jrc3BhY2UoKS5ydW4ocnVubmFibGUsIG1vbml0b3IpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcnVuSW5UZXN0Q29udGV4dChydW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JblRlc3RDb250ZXh0KGZpbmFsIElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB0ZXh0Q3R4UnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkKLQkJewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlleGVjdXRlV29ya3NwYWNlUnVubmFibGUocnVubmFibGUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5Ci0JCXsKLQkJCVRlc3RDb250ZXh0LnJ1bih0ZXh0Q3R4UnVubmFibGUsIHRydWUsIHBtLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLQkJewotCQkJaWYoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXsKLQkJCQl0aHJvdyAoQ29yZUV4Y2VwdGlvbillLmdldENhdXNlKCk7Ci0JCQl9Ci0JCQkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhlY3RlZCBleGNlcHRpb24gdGhyb3duIGJ5IHJ1bm5hYmxlIiwgZS5nZXRDYXVzZSgpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLQkJewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJydXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2Ugd29ya3NwYWNlKCkKLQl7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy90aHJlYWRpbmcvVGVzdENvbnRleHQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmNzY4ODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy90aHJlYWRpbmcvVGVzdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLk1vZGFsQ29udGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi0NCi0vKioNCi0gKiBVdGlsaXR5IHRvIGV4ZWN1dGUgcnVubmFibGUgaW5zdGFuY2VzIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBJbXBsZW1lbnRhdGlvbiBpcyBwcmV0dHkgc2ltaWxhciB0byB7QGxpbmsgTW9kYWxDb250ZXh0fSBidXQgaXQgdXNlcyB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9IHRvIHBlcmZvcm0gZm9ya2luZw0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICogDQotICovDQotcHVibGljIGNsYXNzIFRlc3RDb250ZXh0DQotew0KLQkvKioNCi0JICogRXhlY3V0ZXMgdGhlIG9wZXJhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGNhbGxlciBvciBpbiBhIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gdGhyZWFkIGRlcGVuZGluZyBvbiB0aGUgPGNvZGU+Zm9yazwvY29kZT4gdmFsdWUuIEluIGNhc2UgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyBhIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH0gaW5zdGFuY2UsIHRoZSBleGVjdXRpb24gb2YgdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaXMgcGVyZm9ybWVkIGluIHRoZSBjdXJyZW50IHRocmVhZCBubyBtYXR0ZXINCi0JICogb2YgdGhlIDxjb2RlPmZvcms8L2NvZGU+IHZhbHVlDQotCSAqIA0KLQkgKiBAcGFyYW0gb3BlcmF0aW9uDQotCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbjsgbXVzdCBub3QgYmUgbnVsbA0KLQkgKiBAcGFyYW0gZm9yaw0KLQkgKiAgICAgICAgICAgIHRydWUgdG8gcGVyZm9ybSB0aGUgPGNvZGU+b3BlcmF0aW9uPC9jb2RlPiBpbiBhIHtAbGluayBUZXN0Q29udGV4dFRocmVhZH07IGZhbHNlIHRvIHBlcmZvcm0gdGhlIDxjb2RlPm9wZXJhdGlvbjwvY29kZT4gaW4gdGhlIGN1cnJlbnQgdGhyZWFkDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqICAgICAgICAgICAgcHJvZ3Jlc3MgbW9uaXRvcg0KLQkgKiBAcGFyYW0gZGlzcGxheSBUT0RPDQotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24sIGZpbmFsIGJvb2xlYW4gZm9yaywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlDb250cmFjdENoZWNrZXIubnVsbENoZWNrUGFyYW0ob3BlcmF0aW9uLCAib3BlcmF0aW9uIik7DQotDQotCQlmaW5hbCBib29sZWFuIHdpbGxGb3JrID0gIWlzSW5UZXN0Q29udGV4dFRocmVhZCgpICYmIGZvcms7DQotCQlpZiAod2lsbEZvcmspDQotCQl7DQotCQkJcnVuSW5UZXN0Q29udGV4dFRocmVhZChvcGVyYXRpb24sIG1vbml0b3IsIGRpc3BsYXkpOw0KLQkJfSBlbHNlDQotCQl7DQotCQkJcnVuSW5DdXJyZW50VGhyZWFkKG9wZXJhdGlvbiwgbW9uaXRvcik7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJ1bnMgdGhlIG9wZXJhdGlvbiBpbiB0aGUgY3VycmVudCB0aHJlYWQNCi0JICogDQotCSAqIEBwYXJhbSBvcGVyYXRpb24NCi0JICogICAgICAgICAgICB0aGUgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpZiBhIHtAbGluayBUaHJvd2FibGV9IGhhcyBiZWVuIHRocm93biBkdXJpbmcgb3BlcmF0aW9uIGV4ZWN1dGlvbi4gVGhlIGV4Y2VwdGlvbiB3cmFwcyB0aGF0IHtAbGluayBUaHJvd2FibGV9DQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJ1bkluQ3VycmVudFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbg0KLQl7DQotCQlvcGVyYXRpb24ucnVuKG1vbml0b3IpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSdW5zIHRoZSBvcGVyYXRpb24gaW4gYSB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9Lg0KLQkgKiANCi0JICogQHBhcmFtIHJ1bm5hYmxlDQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uDQotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbg0KLQkgKiAgICAgICAgICAgICBpZiB0aGUge0BsaW5rIFRlc3RDb250ZXh0VGhyZWFkfSBmaW5pc2hlZCB3aXRoIGVycm9yDQotCSAqIEBzZWUgVGVzdENvbnRleHRUaHJlYWQjZ2V0RXJyb3IoKQ0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBydW5JblRlc3RDb250ZXh0VGhyZWFkKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBEaXNwbGF5IGRpc3BsYXkpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFRlc3RDb250ZXh0VGhyZWFkIGNvbnRleHRUaHJlYWQgPSBuZXcgVGVzdENvbnRleHRUaHJlYWQocnVubmFibGUsIG1vbml0b3IsIGRpc3BsYXkpOw0KLQkJY29udGV4dFRocmVhZC5zdGFydCgpOw0KLQkJY29udGV4dFRocmVhZC5ibG9jaygpOw0KLQ0KLQkJaWYgKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSAhPSBudWxsKQ0KLQkJew0KLQkJCWlmKGNvbnRleHRUaHJlYWQuZ2V0RXJyb3IoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsNCi0JCQkJdGhyb3cgKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pY29udGV4dFRocmVhZC5nZXRFcnJvcigpOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oY29udGV4dFRocmVhZC5nZXRFcnJvcigpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnN0YW5jZSBvZiB7QGxpbmsgVGVzdENvbnRleHRUaHJlYWR9DQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5UZXN0Q29udGV4dFRocmVhZCgpDQotCXsNCi0JCWZpbmFsIFRocmVhZCB0ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsNCi0JCXJldHVybiB0IGluc3RhbmNlb2YgVGVzdENvbnRleHRUaHJlYWQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy90aHJlYWRpbmcvVGVzdENvbnRleHRUaHJlYWQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy90ZXN0dXRpbHMvdGhyZWFkaW5nL1Rlc3RDb250ZXh0VGhyZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMWJiOTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3Rlc3R1dGlscy90aHJlYWRpbmcvVGVzdENvbnRleHRUaHJlYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMudGhyZWFkaW5nOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLkNvbnRyYWN0Q2hlY2tlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmxvZ2dpbmcuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5Ow0KLQ0KLS8qKg0KLSAqIHtAbGluayBUaHJlYWR9IGV4dGVuZGVyIHdoaWNoIGlzIGNhcGFibGUgb2YgcHJvdmlkaW5nIGV2ZW50IGxvb3AgcHJvY2Vzc2luZyB3aGlsZSB0aGUgcnVubmFibGUgaXMgZXhlY3V0ZWQ8YnI+DQotICogQSB0eXBpY2FsIHVzYWdlIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlOg0KLSAqIA0KLSAqIDxwcmU+DQotICogVGVzdENvbnRleHRUaHJlYWQgdCA9IG5ldyBUZXN0Q29udGV4dFRocmVhZChzb21lUnVubmFibGUoKSk7DQotICogdC5zdGFydCgpOw0KLSAqIHQuYmxvY2soKTsNCi0gKiA8L3ByZT4NCi0gKiANCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0aHJlYWQgcmVzZW1ibGVzIHRvIHRoZSBNb2RhbENvbnRleHRUaHJlYWQgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IGl0IGRvZXMgbm90IGNhbGwge0BsaW5rIERpc3BsYXkjc2xlZXAoKX0gYW5kIGlzIHNpbXBsaWZpZWQgaW4gb3JkZXIgdG8gbWVldCB0ZXN0IHJlcXVpcmVtZW50cy4gVGhlIHJlYXNvbiBub3QgdG8gY2FsbCB7QGxpbmsgRGlzcGxheSNzbGVlcCgpfSBpcyB0aGF0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyBwdXR0aW5nIHRoZSBkaXNwbGF5IHRvDQotICogc2xlZXAgY2F1c2VzIGp1bml0IHRlc3RzIHRvIHdhaXQgZm9yZXZlcg0KLSAqIA0KLSAqIEBhdXRob3IgRGFuYWlsIEJyYW5la292DQotICovDQotY2xhc3MgVGVzdENvbnRleHRUaHJlYWQgZXh0ZW5kcyBUaHJlYWQNCi17DQotCXByaXZhdGUgYm9vbGVhbiBpc1J1bm5pbmc7DQotCXByaXZhdGUgVGhyb3dhYmxlIGVycm9yVGhyb3dhYmxlOw0KLQlwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsNCi0JcHJpdmF0ZSBmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGU7DQotCXByaXZhdGUgZmluYWwgRGlzcGxheSBkaXNwbGF5Ow0KLQ0KLQlUZXN0Q29udGV4dFRocmVhZChmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRGlzcGxheSBkaXNwbGF5KQ0KLQl7DQotCQlzdXBlcigpOw0KLQkJQ29udHJhY3RDaGVja2VyLm51bGxDaGVja1BhcmFtKHJ1bm5hYmxlLCAicnVubmFibGUiKTsNCi0JCUNvbnRyYWN0Q2hlY2tlci5udWxsQ2hlY2tQYXJhbShtb25pdG9yLCAibW9uaXRvciIpOw0KLQkJDQotCQlpc1J1bm5pbmcgPSB0cnVlOw0KLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsNCi0JCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsNCi0JCXRoaXMuc2V0TmFtZSgiVGVzdENvbnRleHQiKTsNCi0JCXRoaXMuc2V0RGFlbW9uKHRydWUpOw0KLQkJdGhpcy5kaXNwbGF5ID0gZGlzcGxheTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSBlcnJvciB0aHJvd2FibGUgd2hpY2ggaGFwcGVuZWQgZHVyaW5nIGV4ZWN1dGlvbg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgZXJyb3IgdGhyb3dhYmxlIG9yIG51bGwgaWYgbm9uZQ0KLQkgKi8NCi0JcHVibGljIFRocm93YWJsZSBnZXRFcnJvcigpDQotCXsNCi0JCXJldHVybiBlcnJvclRocm93YWJsZTsNCi0JfQ0KLQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgcnVuKCkNCi0Jew0KLQkJaXNSdW5uaW5nID0gdHJ1ZTsNCi0JCXRyeQ0KLQkJew0KLQkJCXJ1bm5hYmxlLnJ1bihtb25pdG9yKTsNCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KQ0KLQkJew0KLQkJCWVycm9yVGhyb3dhYmxlID0gdDsNCi0JCX0gZmluYWxseQ0KLQkJew0KLQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGFzeW5jaHJvbm91cyBldmVudHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgZXZlbnQgbG9vcCB2aWEgc3luYyBleGVjdXRpb24gb2YgYW4gImVtcHR5IiBydW5uYWJsZQ0KLQkJCWRpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKQ0KLQkJCXsNCi0JCQkJcHVibGljIHZvaWQgcnVuKCkNCi0JCQkJew0KLQkJCQl9DQotCQkJfSk7DQotCQkJaXNSdW5uaW5nID0gZmFsc2U7DQotDQotCQkJLy8gRm9yY2UgdGhlIGRpc3BsYXkgdG8gd2FrZSB1cA0KLQkJCWRpc3BsYXkoKS5hc3luY0V4ZWMobnVsbCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEJsb2NrcyB0aGUgY2FsbGVyIHdoaWxlIHRoZSB7QGxpbmsgUnVubmFibGV9IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgaXMgYmVpbmcgZXhlY3V0ZWQuPGJyPg0KLQkgKiBJZiB0aGUgY2FsbGVyIGlzIHRoZSBVSSB0aHJlYWQsIHtAbGluayBEaXNwbGF5I3JlYWRBbmREaXNwYXRjaCgpfSBpcyBpbnZva2VkIGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBldmVudCBsb29wIGlzIHByb2Nlc3NlZDxicj4NCi0JICogSWYgdGhlIGNhbGxlciBpcyBub3QgYSBVSSB0aHJlYWQsIHRoaXMgbWV0aG9kIHNpbXBseSBqb2lucy4gPGJyPg0KLQkgKiANCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24NCi0JICogICAgICAgICAgICAgaW4gY2FzZSB0aGUgbWV0aG9kIGlzIGludm9rZWQgd2l0aGluIGl0cyBvd24gdGhyZWFkDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBibG9jaygpDQotCXsNCi0JCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMpDQotCQl7DQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIGluc2lkZSB0aGUgc2FtZSB0aHJlYWQiKTsNCi0JCX0NCi0NCi0JCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKQ0KLQkJew0KLQkJCXRyeQ0KLQkJCXsNCi0JCQkJam9pbigpOw0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKQ0KLQkJCXsNCi0JCQkJZXJyb3JUaHJvd2FibGUgPSBlOw0KLQkJCX0NCi0JCX0gZWxzZQ0KLQkJew0KLQkJCXdoaWxlIChpc1J1bm5pbmcpDQotCQkJew0KLQkJCQlpZighZGlzcGxheSgpLnJlYWRBbmREaXNwYXRjaCgpKQ0KLQkJCQl7DQotCQkJCQl0cnkNCi0JCQkJCXsNCi0JCQkJCQlUaHJlYWQuc2xlZXAoNTApOw0KLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkNCi0JCQkJCXsNCi0JCQkJCQkvLyBpZ25vcmUNCi0JCQkJCQkobmV3IExvZ2dlcigpKS5sb2dEZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgRGlzcGxheSBkaXNwbGF5KCkNCi0Jew0KLQkJcmV0dXJuIGRpc3BsYXk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQxYTQzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZmIwMzA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWUwNDg0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEp1bCAyMCAxNToyNTozMSBFRVNUIDIwMDkNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmYyMDE5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscywKLSBvcmcuam1vY2ssCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMsCi0gb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmNsYXp6CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmI3YWNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkF1Z3VzdCAyMCwgMjAwOTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNjODhlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotc291cmNlLi4gPSBzcmMvDQotb3V0cHV0Li4gPSBiaW4vDQotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwNCi0gICAgICAgICAgICAgICAuLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcw0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTRjNjAwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSMNCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotQnVuZGxlLU5hbWUuMD1VdGlscyBUZXN0cyAoSW5jdWJhdGlvbikNCi1CdW5kbGUtVmVuZG9yLjA9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvcmVzb3VyY2VzL1N0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJiZmQ5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy9yZXNvdXJjZXMvU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLlN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcjsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLS8qKg0KLSAqIFRlc3QgY2FzZSBmb3IgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyIGNsYXNzDQotICogDQotICogQGF1dGhvciBEYW5haWwgQnJhbmVrb3YNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb24oKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKG51bGwpOw0KLQkJCWZhaWwoIk5QRSBleHBlY3RlZCIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQkvLyBleHBlY3RlZA0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCQlTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXIoIkFCQyIpOw0KLQkJYXNzZXJ0Tm90TnVsbChhZGFwdGVyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCVN0cmluZ0lucHV0U3RyZWFtQWRhcHRlciBhZGFwdGVyID0gbmV3IFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlcigiQUJDIik7DQotCQkJYXNzZXJ0VHJ1ZShhZGFwdGVyLnJlYWQoKSA+IDApOw0KLQ0KLQkJCWFkYXB0ZXIgPSBuZXcgU3RyaW5nSW5wdXRTdHJlYW1BZGFwdGVyKCIiKTsNCi0JCQlhc3NlcnRUcnVlKGFkYXB0ZXIucmVhZCgpID09IC0xKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvQWxsVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGMxYmZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL0FsbFRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnJlc291cmNlcy5TdHJpbmdJbnB1dFN0cmVhbUFkYXB0ZXJUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuRmlsZVV0aWxzVW5pdFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5KYXhXc1V0aWxzVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5VGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uVXRpbHNUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5BcnJheVZhbHVlSW1wbFRlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5Cb29sZWFuVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkNsYXNzVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLkludGVnZXJWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zLlF1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuU3RyaW5nVmFsdWVJbXBsVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmNsYXp6LkFTVFV0aWxzVGVzdDsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHNTdWl0ZQ0KLXsNCi0JLyoqDQotCSAqIFJldHVybnMgYSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgdGhlIHRlc3RzIHRvIGJlIHJ1biBieSBKYXZhIERldmVsb3BlciBUZXN0IERpc3BhdGNoZXINCi0JICogDQotCSAqIEByZXR1cm4gLSBhIHN1aXRlIG9mIGp1bml0IHBkZSB0ZXN0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQ0KLQl7DQotCQlmaW5hbCBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotDQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheVZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25zQmFzZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFubm90YXRpb25VdGlsc1Rlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJvb2xlYW5WYWx1ZUltcGxUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbnRlZ2VyVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ1ZhbHVlSW1wbFRlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsYXNzVmFsdWVJbXBsVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQVNUVXRpbHNUZXN0LmNsYXNzKTsNCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWxlVXRpbHNVbml0VGVzdC5jbGFzcyk7DQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF4V3NVdGlsc1Rlc3QuY2xhc3MpOw0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cmluZ0lucHV0U3RyZWFtQWRhcHRlclRlc3QuY2xhc3MpOw0KLQkJDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvRmlsZVV0aWxzVW5pdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0ZpbGVVdGlsc1VuaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVkNGE5MTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvRmlsZVV0aWxzVW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuU3RhdHVzVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5yZXNvdXJjZXMuRmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMucmVzb3VyY2VzLklGaWxlVXRpbHM7DQotaW1wb3J0IG9yZy5qbW9jay5jb3JlLmNvbnN0cmFpbnQuSXNFcXVhbDsNCi1pbXBvcnQgb3JnLmptb2NrLmNvcmUuY29uc3RyYWludC5Jc1NhbWU7DQotDQotcHVibGljIGNsYXNzIEZpbGVVdGlsc1VuaXRUZXN0IGV4dGVuZHMgTW9ja09iamVjdFRlc3RDYXNlDQotew0KLQlwcml2YXRlIGZpbmFsIElGaWxlVXRpbHMgZmlsZVV0aWxzID0gRmlsZVV0aWxzLmdldEluc3RhbmNlKCk7DQotCXByaXZhdGUgTW9jazxJQ29tcGlsYXRpb25Vbml0PiBjdU1vY2s7DQotCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JDQotCUBPdmVycmlkZQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJY3VNb2NrID0gbW9jayhJQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBpbGF0aW9uVW5pdENvbnRlbnREZWFsc0NvcnJlY3RseVdpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgU3RyaW5nIHRlc3RDb250ZW50ID0gIk15VGVzdENvbnRlbnQiOw0KLQkJZmluYWwgTW9jazxJQnVmZmVyPiBidWZmZXJNb2NrID0gbW9jayhJQnVmZmVyLmNsYXNzKTsNCi0JCWJ1ZmZlck1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgic2V0Q29udGVudHMiKS53aXRoKG5ldyBJc1NhbWUodGVzdENvbnRlbnQpKTsNCi0JCQ0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlY29tZVdvcmtpbmdDb3B5Iik7DQotCQljdU1vY2suZXhwZWN0cyhvbmNlKCkpLm1ldGhvZCgiZ2V0QnVmZmVyIikud2lsbChyZXR1cm5WYWx1ZShidWZmZXJNb2NrLnByb3h5KCkpKTsNCi0JCWN1TW9jay5leHBlY3RzKG9uY2UoKSkubWV0aG9kKCJjb21taXRXb3JraW5nQ29weSIpLndpdGgobmV3IElzRXF1YWwodHJ1ZSksIG5ldyBJc1NhbWUobW9uaXRvcikpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImRpc2NhcmRXb3JraW5nQ29weSIpOw0KLQ0KLQkJZmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoY3VNb2NrLnByb3h5KCksIHRlc3RDb250ZW50LCB0cnVlLCBtb25pdG9yKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBpbGF0aW9uVW5pdENvbnRlbnREb2VzTm90RGlzY2FyZFdvcmtpbmdDb3B5T25KTUUoKQ0KLQl7DQotCQlmaW5hbCBKYXZhTW9kZWxFeGNlcHRpb24gdGVzdEV4Y2VwdGlvbiA9IG5ldyBKYXZhTW9kZWxFeGNlcHRpb24obmV3IENvcmVFeGNlcHRpb24oU3RhdHVzVXRpbHMuc3RhdHVzRXJyb3IoIlRFU1QiKSkpOw0KLQkJY3VNb2NrLmV4cGVjdHMob25jZSgpKS5tZXRob2QoImJlY29tZVdvcmtpbmdDb3B5Iikud2lsbCh0aHJvd0V4Y2VwdGlvbih0ZXN0RXhjZXB0aW9uKSk7DQotCQljdU1vY2suZXhwZWN0cyhuZXZlcigpKS5tZXRob2QoImRpc2NhcmRXb3JraW5nQ29weSIpOw0KLQkJY3VNb2NrLmV4cGVjdHMobmV2ZXIoKSkubWV0aG9kKCJjb21taXRXb3JraW5nQ29weSIpOw0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlmaWxlVXRpbHMuc2V0Q29tcGlsYXRpb25Vbml0Q29udGVudChjdU1vY2sucHJveHkoKSwgIjEyMyIsIHRydWUsIG1vbml0b3IpOw0KLQkJfQ0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSgiVGVzdCBleGNlcHRpb24gd2FzIG5vdCBjYXVnaHQiLCBlID09IHRlc3RFeGNlcHRpb24pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VDb250ZW50U2F2ZXNEaXJ0eUVkaXRvcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIGJvb2xlYW5bXSBzYXZlRWRpdG9ySW52b2tlZCA9IG5ldyBib29sZWFuW117ZmFsc2V9Ow0KLQkJZmluYWwgYm9vbGVhbltdIHNldENvbnRlbnRzSW52b2tlZCA9IG5ldyBib29sZWFuW117ZmFsc2V9Ow0KLQkJDQotCQlmaW5hbCBJRmlsZVV0aWxzIG15RmlsZVV0aWxzID0gbmV3IEZpbGVVdGlscygpew0KLQkJCXB1YmxpYyBib29sZWFuIGlzQ29tcGlsYXRpb25Vbml0RGlzcGxheWVkSW5EaXJ0eUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBjb21waWxhdGlvbiB1bml0IiwgY3UgPT0gY3VNb2NrLnByb3h5KCkpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJDQotCQkJQE92ZXJyaWRlDQotCQkJcHVibGljIHZvaWQgc2F2ZUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZSgiU2F2ZSBlZGl0b3JzIGludm9rZWQgYmVmb3JlIHNldCBDVSBjb250ZW50Iiwgc2V0Q29udGVudHNJbnZva2VkWzBdKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBjb21waWxhdGlvbiB1bml0IiwgY3UgPT0gY3VNb2NrLnByb3h5KCkpOw0KLQkJCQlzYXZlRWRpdG9ySW52b2tlZFswXSA9IHRydWU7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNldENvbXBpbGF0aW9uVW5pdENvbnRlbnQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCQkJCQkJCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkJCXsNCi0JCQkJYXNzZXJ0RmFsc2UoIlNldCBDVSBjb250ZW50IGludm9rZWQgYWZ0ZXIgZWRpdG9yIHNhdmVkIiwgc2F2ZUVkaXRvckludm9rZWRbMF0pOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQ1UgY29udGVudCIsICJNeUNvbnRlbnQiLCBjb250ZW50KTsNCi0JCQkJc2V0Q29udGVudHNJbnZva2VkWzBdID0gdHJ1ZTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlteUZpbGVVdGlscy5zZXRDb21waWxhdGlvblVuaXRDb250ZW50QW5kU2F2ZURpcnR5RWRpdG9ycyhjdU1vY2sucHJveHkoKSwgIk15Q29udGVudCIsIHRydWUsIG51bGwpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2V0IGNvbnRlbnRzIG5vdCBpbnZva2VkIiwgc2V0Q29udGVudHNJbnZva2VkWzBdKTsNCi0JCWFzc2VydFRydWUoIlNhdmUgZWRpdG9ycyBub3QgaW52b2tlZCIsIHNhdmVFZGl0b3JJbnZva2VkWzBdKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldEN1Q29udGVudERvZXNOb3RTYXZlc0NsZWFuRWRpdG9ycygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0Jew0KLQkJZmluYWwgYm9vbGVhbltdIGlzRGlzcGxheWVkSW52b2tlZCA9IG5ldyBib29sZWFuW117ZmFsc2V9Ow0KLQkJZmluYWwgYm9vbGVhbltdIHNldENvbnRlbnRzSW52b2tlZCA9IG5ldyBib29sZWFuW117ZmFsc2V9Ow0KLQkJDQotCQlmaW5hbCBJRmlsZVV0aWxzIG15RmlsZVV0aWxzID0gbmV3IEZpbGVVdGlscygpew0KLQkJCXB1YmxpYyBib29sZWFuIGlzQ29tcGlsYXRpb25Vbml0RGlzcGxheWVkSW5EaXJ0eUVkaXRvcihmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1KQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBjb21waWxhdGlvbiB1bml0IiwgY3UgPT0gY3VNb2NrLnByb3h5KCkpOw0KLQkJCQlpc0Rpc3BsYXllZEludm9rZWRbMF0gPSB0cnVlOw0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJCQ0KLQkJCUBPdmVycmlkZQ0KLQkJCXB1YmxpYyB2b2lkIHNhdmVFZGl0b3IoZmluYWwgSUNvbXBpbGF0aW9uVW5pdCBjdSkNCi0JCQl7DQotCQkJCWZhaWwoIlVuZXhwZWN0ZWQgaW52b2NhdGlvbiIpOw0KLQkJCX0NCi0JCQkNCi0JCQlAT3ZlcnJpZGUNCi0JCQlwdWJsaWMgdm9pZCBzZXRDb21waWxhdGlvblVuaXRDb250ZW50KElDb21waWxhdGlvblVuaXQgdW5pdCwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCQkJCQkJCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24NCi0JCQl7DQotCQkJCWFzc2VydEZhbHNlKCJTZXQgQ1UgY29udGVudCBpbnZva2VkIGFmdGVyIGVkaXRvciBzYXZlZCIsIGlzRGlzcGxheWVkSW52b2tlZFswXSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBDVSBjb250ZW50IiwgIk15Q29udGVudCIsIGNvbnRlbnQpOw0KLQkJCQlzZXRDb250ZW50c0ludm9rZWRbMF0gPSB0cnVlOw0KLQkJCX0NCi0JCX07DQotCQkNCi0JCW15RmlsZVV0aWxzLnNldENvbXBpbGF0aW9uVW5pdENvbnRlbnRBbmRTYXZlRGlydHlFZGl0b3JzKGN1TW9jay5wcm94eSgpLCAiTXlDb250ZW50IiwgdHJ1ZSwgbnVsbCk7DQotCQlhc3NlcnRUcnVlKCJTZXQgY29udGVudHMgbm90IGludm9rZWQiLCBzZXRDb250ZW50c0ludm9rZWRbMF0pOw0KLQkJYXNzZXJ0VHJ1ZSgiSXMgZGlzcGxheWVkIGluIGRpcnR5IGVkaXRvciBub3QgaW52b2tlZCIsIGlzRGlzcGxheWVkSW52b2tlZFswXSk7DQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0pheFdzVXRpbHNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9KYXhXc1V0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMTBmNGI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL0pheFdzVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5qbW9jay5Nb2NrT2JqZWN0VGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5KYXhXc1V0aWxzOw0KLQ0KLXB1YmxpYyBjbGFzcyBKYXhXc1V0aWxzVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiVGVzdEJlYW4iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfRlFfTkFNRSA9ICJvcmcuZWNsaXBzZS50ZXN0LiIgKyBDTEFTU19OQU1FOw0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2VfV2l0aE51bGwoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZShudWxsKTsNCi0JCQlmYWlsKCJOUEUgZXhwZWN0ZWQiKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCS8vIGV4cGVjdGVkDQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCkNCi0Jew0KLQkJU3RyaW5nIG5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoIiIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly8vIikpOw0KLQkJbnMgPSBKYXhXc1V0aWxzLmNvbXBvc2VKYXhXc1RhcmdldE5hbWVzcGFjZUJ5UGFja2FnZSgiYSIpOw0KLQkJYXNzZXJ0VHJ1ZShucy5lcXVhbHMoImh0dHA6Ly9hLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEuYi5jIik7DQotCQlhc3NlcnRUcnVlKG5zLmVxdWFscygiaHR0cDovL2IuYS9jLyIpKTsNCi0JCW5zID0gSmF4V3NVdGlscy5jb21wb3NlSmF4V3NUYXJnZXROYW1lc3BhY2VCeVBhY2thZ2UoImEuYi5jLmQiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYi5hL2MvZC8iKSk7DQotCQlucyA9IEpheFdzVXRpbHMuY29tcG9zZUpheFdzVGFyZ2V0TmFtZXNwYWNlQnlQYWNrYWdlKCJhLmIuYy5kLmUiKTsNCi0JCWFzc2VydFRydWUobnMuZXF1YWxzKCJodHRwOi8vYi5hL2MvZC9lLyIpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTZXJ2aWNlTmFtZSgpDQotCXsNCi0JCXRyeSB7DQotCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0U2VydmljZU5hbWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXyl7fQ0KLQkJDQotCQlhc3NlcnRFcXVhbHMoQ0xBU1NfTkFNRSArICJTZXJ2aWNlIiwgIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFNlcnZpY2VOYW1lKENMQVNTX0ZRX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQb3J0dHlwZU5hbWUoKQ0KLQl7DQotCQl0cnkgew0KLQkJCUpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnR0eXBlTmFtZShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBfKXt9DQotCQkNCi0JCWFzc2VydEVxdWFscyhDTEFTU19OQU1FLCAgSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydHR5cGVOYW1lKENMQVNTX0ZRX05BTUUpKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQb3J0TmFtZSgpDQotCXsNCi0JCXRyeSB7DQotCQkJSmF4V3NVdGlscy5nZXREZWZhdWx0UG9ydE5hbWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gXyl7fQ0KLQkJDQotCQlhc3NlcnRFcXVhbHMoQ0xBU1NfTkFNRSArICJQb3J0IiwgIEpheFdzVXRpbHMuZ2V0RGVmYXVsdFBvcnROYW1lKENMQVNTX0ZRX05BTUUpKTsNCi0JfQ0KLQkNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGQwY2I5NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotDQotLyoqDQotICogQW5ub3RhdGlvbkZhY3RvcnkgY2xhc3MgdGVzdCBjYXNlcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpDQotcHVibGljIGNsYXNzIEFubm90YXRpb25GYWN0b3J5VGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVN0cmluZ1ZhbHVlKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBzdHJWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChzdHJWYWx1ZSk7DQotCQlhc3NlcnRUcnVlKHN0clZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJ2YWx1ZSIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGFyYW1WYWx1ZVBhaXIoKQ0KLQl7DQotCQlJVmFsdWUgc3RyVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUobnVsbCwgc3RyVmFsdWUpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCIiLCBudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCUlQYXJhbVZhbHVlUGFpciB2YWx1ZVBhaXIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHN0clZhbHVlKTsNCi0JCWFzc2VydE5vdE51bGwodmFsdWVQYWlyKTsNCi0JCWFzc2VydFRydWUodmFsdWVQYWlyLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBJVmFsdWUpOw0KLQkJYXNzZXJ0VHJ1ZSh2YWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoInBhcmFtIikpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDb21wbGV4QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gDQotCXsNCi0JCUlWYWx1ZSBzdHJWYWx1ZTEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciB2YWx1ZVBhaXIxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdHJWYWx1ZTEpOw0KLQ0KLQkJSVZhbHVlIHN0clZhbHVlMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTEiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciB2YWx1ZVBhaXIyID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0xIiwgc3RyVmFsdWUyKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHZhbHVlUGFpcjEpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHZhbHVlUGFpcjIpOw0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbihudWxsLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCIiLCBudWxsLCBlbmRwb2ludCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiTXlOYW1lIiwgbnVsbCwgZW5kcG9pbnQpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLS8vCQl0cnkNCi0vLwkJew0KLS8vCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiTXlOYW1lIiwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0vLwkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotLy8JCX0NCi0vLwkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLS8vCQl7DQotLy8JCX0NCi0NCi0JCQ0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBjYSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm5hbWUiLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJYXNzZXJ0Tm90TnVsbChjYSk7DQotCQlhc3NlcnRFcXVhbHMoY2EuZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpLCAyKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVmFsdWVQYWlyKCkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiIiwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUobnVsbCwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXJyYXlWYWx1ZSgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFycmF5VmFsdWUobmV3IEhhc2hTZXQ8SVZhbHVlPigpKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQlJVmFsdWUgc3RyVmFsdWUxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoInZhbHVlMSIpOw0KLQkJSVZhbHVlIHN0clZhbHVlMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZTIiKTsNCi0JCVNldDxJVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlcy5hZGQoc3RyVmFsdWUxKTsNCi0JCXZhbHVlcy5hZGQoc3RyVmFsdWUyKTsNCi0JCQ0KLQkJDQotCQlJVmFsdWUgYXJyVmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBcnJheVZhbHVlKHZhbHVlcyk7DQotCQlhc3NlcnROb3ROdWxsKGFyclZhbHVlKTsNCi0JCWFzc2VydFRydWUoYXJyVmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIlt2YWx1ZTEsIHZhbHVlMl0iKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgpDQotCXsNCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiUU5hbWUiKTsNCi0JCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQkJDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCX0NCi0NCi0JCUlWYWx1ZSBxTmFtZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgib3JnLmVjbGlwc2UuZGVtby5UZXN0Iik7DQotCQlhc3NlcnROb3ROdWxsKHFOYW1lKTsNCi0JCWFzc2VydFRydWUocU5hbWUudG9TdHJpbmcoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmRlbW8uVGVzdCIpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQm9vbGVhblZhbHVlKCkNCi0Jew0KLQkJSVZhbHVlIGJvb2xWYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh0cnVlKTsNCi0JCWFzc2VydE5vdE51bGwoYm9vbFZhbHVlKTsNCi0JCWFzc2VydEVxdWFscyhib29sVmFsdWUudG9TdHJpbmcoKSwgInRydWUiKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0JfQ0KLQ0KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0vLwl7DQotLy8JCXByZXBhcmVQcm9qZWN0KCk7DQotLy8NCi0vLwkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsNCi0vLw0KLS8vCQlJQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdHRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKSBnZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAxKTsNCi0vLwl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbm5vdGF0aW9uc0Zyb21NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOzsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCXByZXBhcmVQcm9qZWN0KCk7DQotCQkNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQuZ2V0UGFja2FnZUZyYWdtZW50KCkpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotCQkNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLiBpbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJTWV0aG9kPj4gYW5ub3RhdGlvbnNNZXRob2QgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbnNJVHlwZVNldE9mU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJU2V0PFN0cmluZz4gdG9SZW1vdmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQl0b1JlbW92ZS5hZGQoIldlYlNlcnZpY2UiKTsNCi0JCXRvUmVtb3ZlLmFkZCgiV2ViTWV0aG9kIik7DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9ucyhudWxsLCB0b1JlbW92ZSk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQl0cnkNCi0JCXsNCi0JCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9ucyhlbmRwb2ludC5nZXRQYWNrYWdlRnJhZ21lbnQoKSwgdG9SZW1vdmUpOw0KLQkJCWZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9DQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpDQotCQl7DQotCQl9DQotDQotCQkNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zKGVuZHBvaW50LCB0b1JlbW92ZSk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiAvLyAkSkwtRVhDJA0KLQl7DQotCQlwcmVwYXJlUHJvamVjdCgpOw0KLQ0KLQkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQkJYXNzZXJ0Tm90TnVsbChmaWVsZCk7DQotDQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChmaWVsZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCkgPT0gMSk7DQotDQotLy8JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tRmllbGQoZmllbGQpOw0KLS8vCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0vLwkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb25zSU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gLy8gJEpMLUVYQyQNCi0Jew0KLQkJcHJlcGFyZVByb2plY3QoKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kKCJhbm5vdGF0ZWRNZXRob2QiLCBuZXcgU3RyaW5nW10geyAiUVN0cmluZzsiIH0pOw0KLQkJZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQ0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQobWV0aG9kKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IGFubm90YXRpb25zTWV0aG9kID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc01ldGhvZC5zaXplKCk9PSAwKTsNCi0NCi0vLwkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21GaWVsZChmaWVsZCk7DQotLy8JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLS8vCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIC8vICRKTC1FWEMkDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25JbnNwZWN0b3JJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwODQ1YjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbkluc3BlY3RvckltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVBhcmFtVmFsdWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFVwU3BlY2lmaWMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjIiwgIkVuZHBvaW50QW5uSW5zcGVjdG9yIik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEluc3BlY3RvcigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihudWxsKS5pbnNwZWN0VHlwZSgpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biEiKTsNCi0JCX0NCi0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSANCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5DQotCQl7DQotCQkJQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0NCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIA0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCQkNCi0JCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJNeSBWYWx1ZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJRmllbGQ+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RGaWVsZChlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElGaWVsZD4gYW5uUCA9IGFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm5QKTsNCi0JCQ0KLQkJYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpKTsNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkNCi0NCi0JCUlNZXRob2RbXSBtZXRob2RzID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpOw0KLQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpDQotCQl7DQotCQkJaWYobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkgIT0gbnVsbCAmJiBtZXRob2QuZ2V0UmF3UGFyYW1ldGVyTmFtZXMoKS5sZW5ndGggPiAwKQ0KLQkJCXsNCi0JCQkJZm9yKGludCBpID0gMDsgaSA8IG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpLmxlbmd0aDsgaSsrKQ0KLQkJCQl7DQotCQkJCQlJVHlwZVBhcmFtZXRlciBwYXJhbSA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpW2ldKTsNCi0NCi0JCQkJCUlWYWx1ZSBzdlBhcmFtID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZyBWYWx1IFBhcmFtIik7DQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwdlBhcmFtID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJCQkJcHZQYXJhbS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiUGFyYW1BdHJpYnV0ZSIsIHN2UGFyYW0pKTsNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBhbm5QYW0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJQYXJhbUFubm90YXRpb24iLCBwdlBhcmFtLCBwYXJhbSk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uUGFtLCBwYXJhbSk7DQotCQkJCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB0bXBBbm4gPSBwYXJhbUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQkJDQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKHRtcEFubik7DQotCQkJCQlwYXJhbUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHBhcmFtKTsNCi0JCQkJCWFzc2VydE5vdE51bGwocGFyYW1Bbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKHBhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJCQkJDQotCQkJCQlhbm5QYW0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJQYXJhbUFubm90YXRpb24yIiwgcHZQYXJhbSwgcGFyYW0pOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFublBhbSwgcGFyYW0pOw0KLQkJCQkJcGFyYW1Bbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbShwYXJhbSk7DQotCQkJCQlhc3NlcnROb3ROdWxsKHBhcmFtQW5ub3RhdGlvbnMpOw0KLQkJCQkJYXNzZXJ0VHJ1ZShwYXJhbUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCQkJCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KHBhcmFtKTsNCi0JCQkJCXBhcmFtQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0ocGFyYW0pOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChwYXJhbUFubm90YXRpb25zKTsNCi0JCQkJCWFzc2VydFRydWUocGFyYW1Bbm5vdGF0aW9ucy5zaXplKCkgPT0gMCk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0b3JTcGVjaWZpY0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwU3BlY2lmaWMoKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoIm9yZy5lY2xpcHNlLmRlbW8uTXlBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJteVZhbHVlIiksICJNeVN0cmluZyIpOyANCi0JCQ0KLQkJaW5zcGVjdGVkVHlwZUFubm90YXRpb24gPSBudWxsOw0KLQkJCQkNCi0JCWluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uKTsNCi0JCWFzc2VydFRydWUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIi5lbmRzV2l0aChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgic2VydmljZU5hbWUiKSwgIldTSW1wbEJlYW5TZXJ2aWNlIik7IA0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgIldTSW1wbEJlYW4iKTsgDQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidGFyZ2V0TmFtZXNwYWNlIiksICJodHRwOi8vZGVtby9lY2xpcHNlL29yZy8iKTsgDQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicG9ydE5hbWUiKSwgIldTSW1wbEJlYW5Qb3J0Iik7IA0KLQ0KLQkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQkJSUFubm90YXRpb248SUZpZWxkPiBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZmllbGQsICJvcmcuZWNsaXBzZS5kZW1vLk15RmllbGRBbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJvcmcuZWNsaXBzZS5kZW1vLk15RmllbGRBbm5vdGF0aW9uIi5lbmRzV2l0aChpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJmaWVsZDEiKTsNCi0JCQ0KLQkJaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gbnVsbDsNCi0JCQ0KLQkJaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdEZpZWxkKGZpZWxkLCAiamF2YXguandzLldlYkZpZWxkIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJqYXZheC5qd3MuV2ViRmllbGQiLmVuZHNXaXRoKGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgIk15RmllbGQiKTsNCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpWzBdOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAib3JnLmVjbGlwc2UuZGVtby5NeU1ldGhvZEFubm90YXRpb24iKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJvcmcuZWNsaXBzZS5kZW1vLk15TWV0aG9kQW5ub3RhdGlvbiIuZW5kc1dpdGgoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJhbm5vdGF0ZWRNZXRob2QiKTsNCi0JCQ0KLQkJaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IG51bGw7DQotCQkNCi0JCWluc3BlY3RlZE1ldGhvZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCwgImphdmF4Lmp3cy5XZWJNZXRob2QiKTsNCi0JCWFzc2VydE5vdE51bGwoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJqYXZheC5qd3MuV2ViTWV0aG9kIi5lbmRzV2l0aChpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKTsNCi0JCWFzc2VydEVxdWFscyhpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImV4Y2x1ZGUiKSwgImZhbHNlIik7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGVyYXRpb25OYW1lIiksICJ0ZXN0Iik7DQotDQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIoImFubm90YXRlZFBhcmFtIik7DQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIsICJvcmcuZWNsaXBzZS5kZW1vLk15UGFyYW1Bbm5vdGF0aW9uIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJvcmcuZWNsaXBzZS5kZW1vLk15UGFyYW1Bbm5vdGF0aW9uIi5lbmRzV2l0aChpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJYXNzZXJ0RXF1YWxzKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuYW1lIiksICJhbm5vdGF0ZWRNeVBhcmFtIik7DQotCQkNCi0JCWluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IG51bGw7DQotCQkNCi0JCWluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAiamF2YXguandzLldlYlBhcmFtIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbik7DQotCQlhc3NlcnRUcnVlKCJqYXZheC5qd3MuV2ViUGFyYW0iLmVuZHNXaXRoKGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQlhc3NlcnRFcXVhbHMoaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5hbWUiKSwgImFubm90YXRlZFBhcmFtIik7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RJbnNwZWN0b3JMb2NhdG9yUmV0cmlldmVkKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcFNwZWNpZmljKCk7CQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKDExLCBhbm5vdGF0aW9uLmdldExvY2F0b3IoKS5nZXRMaW5lTnVtYmVyKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDIyNiwgYW5ub3RhdGlvbi5nZXRMb2NhdG9yKCkuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygxMzQsIGFubm90YXRpb24uZ2V0TG9jYXRvcigpLmdldExlbmd0aCgpKTsNCi0JCQ0KLQkJYXNzZXJ0RXF1YWxzKDExLCBnZXRQYXJhbSgicG9ydE5hbWUiLCBhbm5vdGF0aW9uKS5nZXRMb2NhdG9yKCkuZ2V0TGluZU51bWJlcigpKTsNCi0JCWFzc2VydEVxdWFscygzMzQsIGdldFBhcmFtKCJwb3J0TmFtZSIsIGFubm90YXRpb24pLmdldExvY2F0b3IoKS5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKDI1LCBnZXRQYXJhbSgicG9ydE5hbWUiLCBhbm5vdGF0aW9uKS5nZXRMb2NhdG9yKCkuZ2V0TGVuZ3RoKCkpOwkJDQotCX0NCi0JDQotCXByaXZhdGUgSVBhcmFtVmFsdWVQYWlyIGdldFBhcmFtKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBJQW5ub3RhdGlvbjw/IGV4dGVuZHMgSUphdmFFbGVtZW50PiBhbm5vdGF0aW9uKSANCi0Jew0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW0gOiBhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpKSB7DQotCQkJaWYocGFyYW0uZ2V0UGFyYW0oKS5lcXVhbHMobmFtZSkpIHsNCi0JCQkJcmV0dXJuIHBhcmFtOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjBkYmU3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25Qcm9wZXJ0eTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5BdHRyaWJ1dGVUeXBlRW51bTsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsNCi0JcHJpdmF0ZSBNb2NrPElUeXBlPiB0eXBlID0gbW9jayhJVHlwZS5jbGFzcyk7DQotCXByaXZhdGUgTW9jazxJTWV0aG9kPiBtZXRob2QgPSBtb2NrKElNZXRob2QuY2xhc3MpOw0KLQlwcml2YXRlIE1vY2s8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXIgPSBtb2NrKElUeXBlUGFyYW1ldGVyLmNsYXNzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RCYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJdHJ5IA0KLQkJew0KLQkJCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkobnVsbCwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5IA0KLQkJew0KLQkJCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lIiwgInZhbHVlIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgbnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24hIik7DQotCQl9DQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQ0KLQkJdHJ5IA0KLQkJew0KLQkJCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lIiwgInZhbHVlIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFDS0FHRSk7DQotCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyBub3QgdGhyb3duISIpOw0KLQkJfQ0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMZXZlbCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUxIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMiIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMyIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lNCIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDQpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJdHlwZUFubm90YXRpb25zID0gY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpOw0KLQ0KLQkJU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQluYW1lcy5jbGVhcigpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTEiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUyIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMyIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTQiKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbiA6IHR5cGVBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOw0KLQkJCW5hbWVzLnJlbW92ZShhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpOw0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMSIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUyIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lMyIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsJDQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJfQ0KLQkJCWlmKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lNCIpKQ0KLQkJCXsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSAxKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOwkJCQkNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RMZXZlbCgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlDb250YWluZXIoKTsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eSBhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJ0cnVlIiwgQXR0cmlidXRlVHlwZUVudW0uQk9PTEVBTik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVN0cmluZyIsICJ2YWx1ZVN0cmluZyIsIEF0dHJpYnV0ZVR5cGVFbnVtLlNUUklORyk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJU2V0PElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSk7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUJvb2xlYW4iKS5lcXVhbHMoInRydWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIikuZXF1YWxzKCIxMDAiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTEiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTIiLCAiYXR0cmlidXRlTmFtZUludGVnZXIiLCAiMTAwIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuTUVUSE9EKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lMyIsICJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIiwgIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIsIEF0dHJpYnV0ZVR5cGVFbnVtLlFVQUxJRklFRF9OQU1FKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWU0IiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDApOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSA0KTsNCi0JCW1ldGhvZEFubm90YXRpb25zID0gY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKTsNCi0NCi0JCVNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJbmFtZXMuY2xlYXIoKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUxIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMiIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTMiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWU0Iik7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SU1ldGhvZD4gYW5ub3RhdGlvbiA6IG1ldGhvZEFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUobmFtZXMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQkJbmFtZXMucmVtb3ZlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUxIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTIiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUzIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWU0IikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZUJvb2xlYW4iLCAidHJ1ZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZSIsICJhdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDAiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lIiwgImF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQkNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAwKTsNCi0JCVNldDxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtZXRlckFubm90YXRpb25zID0gY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSk7DQotCQkNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gOiBwYXJhbWV0ZXJBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoImFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJhdHRyaWJ1dGVOYW1lUXVhbGlmaWVkIikuZXF1YWxzKCJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVTdHJpbmciKS5lcXVhbHMoInZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lcigpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUxIiwgImF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgiYW5ub3RhdGlvbk5hbWUyIiwgImF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJhbm5vdGF0aW9uTmFtZTMiLCAiYXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoImFubm90YXRpb25OYW1lNCIsICJhdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRUeXBlQW5ub3RhdGlvbnModHlwZS5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpLnNpemUoKSA9PSA0KTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldE1ldGhvZEFubm90YXRpb25zKG1ldGhvZC5wcm94eSgpKS5zaXplKCkgPT0gMCk7DQotCQlwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucyh0eXBlUGFyYW1ldGVyLnByb3h5KCkpOw0KLQ0KLQkJU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7DQotCQluYW1lcy5jbGVhcigpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTEiKTsNCi0JCW5hbWVzLmFkZCgiYW5ub3RhdGlvbk5hbWUyIik7DQotCQluYW1lcy5hZGQoImFubm90YXRpb25OYW1lMyIpOw0KLQkJbmFtZXMuYWRkKCJhbm5vdGF0aW9uTmFtZTQiKTsNCi0JCQ0KLQkJZm9yIChJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA6IHBhcmFtZXRlckFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUobmFtZXMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7DQotCQkJbmFtZXMucmVtb3ZlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUxIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJ0cnVlIikpOw0KLQkJCX0NCi0JCQlpZihhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJhbm5vdGF0aW9uTmFtZTIiKSkNCi0JCQl7DQotCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gMSk7CQ0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMCIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWUzIikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOwkNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5WQUxVRSIpKTsNCi0JCQl9DQotCQkJaWYoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiYW5ub3RhdGlvbk5hbWU0IikpDQotCQkJew0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuc2l6ZSgpID09IDEpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidmFsdWVTdHJpbmciKSk7CQkJCQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCUFubm90YXRpb25Qcm9wZXJ0eUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5Q29udGFpbmVyKCk7DQotCQlBbm5vdGF0aW9uUHJvcGVydHkgYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVCb29sZWFuIiwgInRydWUiLCBBdHRyaWJ1dGVUeXBlRW51bS5CT09MRUFOKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5QQVJBTUVURVIpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgicGFyYW1Bbm5vdGF0aW9uTmFtZSIsICJwYXJhbUF0dHJpYnV0ZU5hbWVJbnRlZ2VyIiwgIjEwMCIsIEF0dHJpYnV0ZVR5cGVFbnVtLklOVEVHRVIpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJwYXJhbUFubm90YXRpb25OYW1lIiwgInBhcmFtQXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uUEFSQU1fVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuUEFSQU1FVEVSKTsNCi0JCWFubm90YXRpb25Qcm9wZXJ0eSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHkoInBhcmFtQW5ub3RhdGlvbk5hbWUiLCAicGFyYW1BdHRyaWJ1dGVOYW1lU3RyaW5nIiwgInBhcmFtVmFsdWVTdHJpbmciLCBBdHRyaWJ1dGVUeXBlRW51bS5TVFJJTkcpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlBBUkFNRVRFUik7DQotDQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJtZXRob2RBbm5vdGF0aW9uTmFtZSIsICJtZXRob2RBdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJmYWxzZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJtZXRob2RBbm5vdGF0aW9uTmFtZSIsICJtZXRob2RBdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxMDEiLCBBdHRyaWJ1dGVUeXBlRW51bS5JTlRFR0VSKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgibWV0aG9kQW5ub3RhdGlvbk5hbWUiLCAibWV0aG9kQXR0cmlidXRlTmFtZVF1YWxpZmllZCIsICJvcmcuZWNsaXBzZS50ZXN0RW51bWVyYXRpb24uTUVUSE9EX1ZBTFVFIiwgQXR0cmlidXRlVHlwZUVudW0uUVVBTElGSUVEX05BTUUpOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLk1FVEhPRCk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJtZXRob2RBbm5vdGF0aW9uTmFtZSIsICJtZXRob2RBdHRyaWJ1dGVOYW1lU3RyaW5nIiwgIm1ldGhvZFZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5NRVRIT0QpOw0KLQ0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lQm9vbGVhbiIsICJmYWxzZSIsIEF0dHJpYnV0ZVR5cGVFbnVtLkJPT0xFQU4pOw0KLQkJY29udGFpbmVyLmFkZEFubm90YXRpb25Qcm9wZXJ0eShhbm5vdGF0aW9uUHJvcGVydHksIEVsZW1lbnRUeXBlLlRZUEUpOw0KLQkJYW5ub3RhdGlvblByb3BlcnR5ID0gbmV3IEFubm90YXRpb25Qcm9wZXJ0eSgidHlwZUFubm90YXRpb25OYW1lIiwgInR5cGVBdHRyaWJ1dGVOYW1lSW50ZWdlciIsICIxIiwgQXR0cmlidXRlVHlwZUVudW0uSU5URUdFUik7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiLCAib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLlRZUEVfVkFMVUUiLCBBdHRyaWJ1dGVUeXBlRW51bS5RVUFMSUZJRURfTkFNRSk7DQotCQljb250YWluZXIuYWRkQW5ub3RhdGlvblByb3BlcnR5KGFubm90YXRpb25Qcm9wZXJ0eSwgRWxlbWVudFR5cGUuVFlQRSk7DQotCQlhbm5vdGF0aW9uUHJvcGVydHkgPSBuZXcgQW5ub3RhdGlvblByb3BlcnR5KCJ0eXBlQW5ub3RhdGlvbk5hbWUiLCAidHlwZUF0dHJpYnV0ZU5hbWVTdHJpbmciLCAidHlwZVZhbHVlU3RyaW5nIiwgQXR0cmlidXRlVHlwZUVudW0uU1RSSU5HKTsNCi0JCWNvbnRhaW5lci5hZGRBbm5vdGF0aW9uUHJvcGVydHkoYW5ub3RhdGlvblByb3BlcnR5LCBFbGVtZW50VHlwZS5UWVBFKTsNCi0NCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFR5cGVBbm5vdGF0aW9ucyh0eXBlLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCWFzc2VydFRydWUoY29udGFpbmVyLmdldFBhcmFtZXRlckFubm90YXRpb25zKHR5cGVQYXJhbWV0ZXIucHJveHkoKSkuc2l6ZSgpID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0TWV0aG9kQW5ub3RhdGlvbnMobWV0aG9kLnByb3h5KCkpLnNpemUoKSA9PSAxKTsNCi0JCQ0KLQkJU2V0PElBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPj4gcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnModHlwZVBhcmFtZXRlci5wcm94eSgpKTsNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFubm90YXRpb24gOiBwYXJhbWV0ZXJBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoInBhcmFtQW5ub3RhdGlvbk5hbWUiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSA9PSA0KTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1BdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygidHJ1ZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1BdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMTAwIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbUF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5QQVJBTV9WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW1BdHRyaWJ1dGVOYW1lU3RyaW5nIikuZXF1YWxzKCJwYXJhbVZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQ0KLQkJU2V0PElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IGNvbnRhaW5lci5nZXRNZXRob2RBbm5vdGF0aW9ucyhtZXRob2QucHJveHkoKSk7DQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoIm1ldGhvZEFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm1ldGhvZEF0dHJpYnV0ZU5hbWVCb29sZWFuIikuZXF1YWxzKCJmYWxzZSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibWV0aG9kQXR0cmlidXRlTmFtZUludGVnZXIiKS5lcXVhbHMoIjEwMSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibWV0aG9kQXR0cmlidXRlTmFtZVF1YWxpZmllZCIpLmVxdWFscygib3JnLmVjbGlwc2UudGVzdEVudW1lcmF0aW9uLk1FVEhPRF9WQUxVRSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibWV0aG9kQXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygibWV0aG9kVmFsdWVTdHJpbmciKSk7DQotCQl9DQotDQotCQlTZXQ8SUFubm90YXRpb248SVR5cGU+PiB0eXBlQW5ub3RhdGlvbnMgPSBjb250YWluZXIuZ2V0VHlwZUFubm90YXRpb25zKHR5cGUucHJveHkoKSk7DQotCQlmb3IgKElBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygidHlwZUFubm90YXRpb25OYW1lIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgPT0gNCk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lQm9vbGVhbiIpLmVxdWFscygiZmFsc2UiKSk7DQotCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInR5cGVBdHRyaWJ1dGVOYW1lSW50ZWdlciIpLmVxdWFscygiMSIpKTsNCi0JCQlhc3NlcnRUcnVlKGFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgidHlwZUF0dHJpYnV0ZU5hbWVRdWFsaWZpZWQiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLnRlc3RFbnVtZXJhdGlvbi5UWVBFX1ZBTFVFIikpOw0KLQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0eXBlQXR0cmlidXRlTmFtZVN0cmluZyIpLmVxdWFscygidHlwZVZhbHVlU3RyaW5nIikpOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25VdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25VdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWQyNDUyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Bbm5vdGF0aW9uVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblV0aWxzVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk15IFN0cmluZyBWYWx1ZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiUGFyYW0iLCBzdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBcHBsaWVkRWxlbWVudCgpLCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zQmFzZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxNWQxNDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNCYXNlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMucHJvamVjdC5DbGFzc0xvYWRpbmdUZXN0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbldyaXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklBbm5vdGF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUxvY2F0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JVmFsdWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkFubm90YXRpb25JbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc0Jhc2VJbXBsVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBXaXRvdXRSZW1vdmUoKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcFdpdG91dFJlbW92ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0VXBXaXRvdXRSZW1vdmUyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50QW5uSW5zcGVjdG9yLnNyYyIsICJFbmRwb2ludEFubkluc3BlY3RvciIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzZUFubm90YXR0aW9uRnVuY3Rpb25hbGl0eSgpDQotCXsNCi0JCUFubm90YXRpb25JbXBsPElUeXBlPiBhbm4gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJjb20uc3BhLnRlc3QuTXlBbm5vdGF0aW9uIiwgbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgImNvbS5zcGEudGVzdC5NeUFubm90YXRpb24iKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0U2ltcGxlQW5ub3RhdGlvbk5hbWUoKSwgIk15QW5ub3RhdGlvbiIpOw0KLQkJLy9hc3NlcnRFcXVhbHMoYW5uLmdldFZhbHVlVHlwZSgpLCBJVmFsdWUuQU5OT1RBVElPTl9WQUxVRSk7DQotCQkNCi0JCWFubiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oIk15TmV3QW5ub3RhdGlvbiIsIG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKSk7DQotCQlhc3NlcnRFcXVhbHMoYW5uLmdldEFubm90YXRpb25OYW1lKCksICJNeU5ld0Fubm90YXRpb24iKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0U2ltcGxlQW5ub3RhdGlvbk5hbWUoKSwgIk15TmV3QW5ub3RhdGlvbiIpOw0KLQkJLy9hc3NlcnRFcXVhbHMoYW5uLmdldFZhbHVlVHlwZSgpLCBJVmFsdWUuQU5OT1RBVElPTl9WQUxVRSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0NCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IHRtcEFubiA9IGFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKHRtcEFubik7DQotCQkNCi0JCWFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApOw0KLQkJDQotCQlJTWV0aG9kW10gbWV0aG9kcyA9IGVuZHBvaW50LmdldE1ldGhvZHMoKTsNCi0JCWZvciAoSU1ldGhvZCBtZXRob2QgOiBtZXRob2RzKQ0KLQkJew0KLQkJCWlmKG1ldGhvZC5nZXRSYXdQYXJhbWV0ZXJOYW1lcygpICE9IG51bGwgJiYgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoID4gMCkNCi0JCQl7DQotCQkJCUlBbm5vdGF0aW9uPElNZXRob2Q+IGFubk0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbk1ldGhvZCIsIHB2LCBtZXRob2QpOw0KLQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uTSwgbWV0aG9kKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJmdWxsLnF1YWxpZmllZC5OYW1lIiwgYW5uTS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpKTsNCi0JCQkJYXNzZXJ0TnVsbChhbm5NLmdldFByb3BlcnR5VmFsdWUoInBhcmFtTm90RXhpc3RzIikpOw0KLQkJCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCUlBbm5vdGF0aW9uPElNZXRob2Q+IGFubm90YXRNID0gYW5ub3RhdGlvbnNNLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQlhc3NlcnRFcXVhbHMoInF1YWxpZmllZC5OYW1lIiwgYW5ub3RhdE0uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKSk7DQotCQkJCQ0KLQkJCQlJVmFsdWUgc3YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3IFN0cmluZyBWYWx1ZSIpOw0KLQkJCQlhbm5NLmdldFBhcmFtVmFsdWVQYWlycygpLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJOZXdQYXJhbSIsIHN2KSk7DQotCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUoYW5uTSk7DQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDEpOw0KLQkJCQlhbm5vdGF0TSA9IGFubm90YXRpb25zTS5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJOZXcgU3RyaW5nIFZhbHVlIiwgYW5ub3RhdE0uZ2V0UHJvcGVydHlWYWx1ZSgiTmV3UGFyYW0iKSk7DQotCQkJCWFzc2VydEVxdWFscygicXVhbGlmaWVkLk5hbWUiLCBhbm5vdGF0TS5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm5vdGF0TSk7DQotCQkJCWFubm90YXRpb25zTSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kKTsNCi0JCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uc00uc2l6ZSgpID09IDApOw0KLQ0KLQkJCQlJVmFsdWUgc3YzID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ldyBTdHJpbmcgVmFsdWUzIik7DQotCQkJCWFubk0uZ2V0UGFyYW1WYWx1ZVBhaXJzKCkuY2xlYXIoKTsNCi0JCQkJYW5uTS5nZXRQYXJhbVZhbHVlUGFpcnMoKS5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiTmV3UGFyYW0iLCBzdjMpKTsNCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShhbm5NKTsNCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMSk7DQotCQkJCWFubm90YXRNID0gYW5ub3RhdGlvbnNNLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIk5ldyBTdHJpbmcgVmFsdWUzIiwgYW5ub3RhdE0uZ2V0UHJvcGVydHlWYWx1ZSgiTmV3UGFyYW0iKSk7DQotDQotCQkJCS8vIGNsZWFyIGFubm90YXRpb24NCi0JCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm5NKTsNCi0NCi0JCQkJYW5ub3RhdGlvbnNNID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QpOw0KLQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zTS5zaXplKCkgPT0gMCk7DQotCQkJCQ0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKCkubGVuZ3RoOyBpKyspDQotCQkJCXsNCi0JCQkJCUlUeXBlUGFyYW1ldGVyIHBhcmFtID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXIobWV0aG9kLmdldFJhd1BhcmFtZXRlck5hbWVzKClbaV0pOw0KLQ0KLQkJCQkJSVZhbHVlIHN2UGFyYW0gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiU3RyaW5nIFZhbHUgUGFyYW0iKTsNCi0JCQkJCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2UGFyYW0gPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQlwdlBhcmFtLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJQYXJhbUF0cmlidXRlIiwgc3ZQYXJhbSkpOw0KLQkJCQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGFublAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJQYXJhbUFubm90YXRpb24iLCBwdlBhcmFtLCBwYXJhbSk7DQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uUCwgcGFyYW0pOw0KLQkJCQkJDQotCQkJCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFublApOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdHRpb25VcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBzdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJTdHJpbmdWYWx1ZSIpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gc3B2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJc3B2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIHN2KSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gdHlwZUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15VHlwZUFubm90YXRpb24iLCBzcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudCh0eXBlQW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IHR5cGVBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGVBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHR5cGVBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gdGVtcFR5cGVBbm5vdGF0aW9uID0gdHlwZUFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJzdHJpbmdQYXJhbSIpLCAiU3RyaW5nVmFsdWUiKTsNCi0JCQ0KLQkJSVZhbHVlIG5ld1NWID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIk5ld1N0cmluZ1ZhbHVlIik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBuZXdTUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdTUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgbmV3U1YpKTsNCi0JCUFubm90YXRpb25JbXBsPElUeXBlPiBuZXdUeXBlQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJVHlwZT4oIm9yZy5lY2xpcHNlLnRlc3QuTXlUeXBlQW5ub3RhdGlvbiIsIG5ld1NQVik7DQotCQluZXdUeXBlQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGVuZHBvaW50KTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdUeXBlQW5ub3RhdGlvbik7DQotCQkNCi0JCXR5cGVBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQlhc3NlcnROb3ROdWxsKHR5cGVBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHR5cGVBbm5vdGF0aW9ucy5zaXplKCkgPT0gMSk7DQotCQl0ZW1wVHlwZUFubm90YXRpb24gPSB0eXBlQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInN0cmluZ1BhcmFtIiksICJOZXdTdHJpbmdWYWx1ZSIpOw0KLQ0KLQkJbmV3U1YgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgiTmV3ZXN0U3RyaW5nVmFsdWUiKTsNCi0JCW5ld1NQViA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCW5ld1NQVi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgibmV3ZXN0U3RyaW5nUGFyYW0iLCBuZXdTVikpOw0KLQkJbmV3VHlwZUFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGU+KCJvcmcuZWNsaXBzZS50ZXN0Lk15VHlwZUFubm90YXRpb24iLCBuZXdTUFYpOw0KLQkJbmV3VHlwZUFubm90YXRpb24uc2V0QXBwbGllZEVsZW1lbnRXaXRob3V0U2F2ZShlbmRwb2ludCk7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3VHlwZUFubm90YXRpb24pOw0KLQ0KLQkJdHlwZUFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCWFzc2VydE5vdE51bGwodHlwZUFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUodHlwZUFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBUeXBlQW5ub3RhdGlvbiA9IHR5cGVBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydE51bGwodGVtcFR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInN0cmluZ1BhcmFtIikpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBUeXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJuZXdlc3RTdHJpbmdQYXJhbSIpLCAiTmV3ZXN0U3RyaW5nVmFsdWUiKTsNCi0NCi0JCUlNZXRob2QgZmlyc3RNZXRob2QgPSBlbmRwb2ludC5nZXRNZXRob2RzKClbMF07DQotDQotCQlJVmFsdWUgaXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVJbnRlZ2VyVmFsdWUoIjEwIik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBpcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlpcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImludGVnZXJQYXJhbSIsIGl2KSk7DQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBtZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeU1ldGhvZEFubm90YXRpb24iLCBpcHYsIGZpcnN0TWV0aG9kKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChtZXRob2RBbm5vdGF0aW9uLCBmaXJzdE1ldGhvZCk7DQotDQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBtZXRob2RBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QoZmlyc3RNZXRob2QpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKG1ldGhvZEFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElNZXRob2Q+IHRlbXBNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiaW50ZWdlclBhcmFtIiksICIxMCIpOw0KLQkJDQotCQlJVmFsdWUgbmV3SVYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVJbnRlZ2VyVmFsdWUoIjExIik7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBuZXdJUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdJUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoImludGVnZXJQYXJhbSIsIG5ld0lWKSk7DQotCQlBbm5vdGF0aW9uSW1wbDxJTWV0aG9kPiBuZXdNZXRob2RBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElNZXRob2Q+KCJvcmcuZWNsaXBzZS50ZXN0Lk15TWV0aG9kQW5ub3RhdGlvbiIsIG5ld0lQVik7DQotCQluZXdNZXRob2RBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoZmlyc3RNZXRob2QpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld01ldGhvZEFubm90YXRpb24pOw0KLQkJDQotCQltZXRob2RBbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QoZmlyc3RNZXRob2QpOw0KLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKG1ldGhvZEFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBNZXRob2RBbm5vdGF0aW9uID0gbWV0aG9kQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiaW50ZWdlclBhcmFtIiksICIxMSIpOw0KLQ0KLQkJbmV3SVYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVJbnRlZ2VyVmFsdWUoIjEwMCIpOw0KLQkJbmV3SVBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3SVBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJuZXdlc3RJbnRlZ2VyUGFyYW0iLCBuZXdJVikpOw0KLQkJbmV3TWV0aG9kQW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uSW1wbDxJTWV0aG9kPigib3JnLmVjbGlwc2UudGVzdC5NeU1ldGhvZEFubm90YXRpb24iLCBuZXdJUFYpOw0KLQkJbmV3TWV0aG9kQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKGZpcnN0TWV0aG9kKTsNCi0JCQ0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZShuZXdNZXRob2RBbm5vdGF0aW9uKTsNCi0NCi0JCW1ldGhvZEFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChmaXJzdE1ldGhvZCk7DQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZEFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUobWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcE1ldGhvZEFubm90YXRpb24gPSBtZXRob2RBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydE51bGwodGVtcE1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiaW50ZWdlclBhcmFtIikpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBNZXRob2RBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5ld2VzdEludGVnZXJQYXJhbSIpLCAiMTAwIik7DQotDQotCQlJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyID0gZmlyc3RNZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0NCi0JCUlWYWx1ZSBidiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZSh0cnVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IGJwdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCWJwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiYm9vbGVhblBhcmFtIiwgYnYpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiBwYXJhbWV0ZXJBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeVBhcmFtZXRlckFubm90YXRpb24iLCBicHYsIHR5cGVQYXJhbWV0ZXIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHBhcmFtZXRlckFubm90YXRpb24sIHR5cGVQYXJhbWV0ZXIpOw0KLQ0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4+IHBhcmFtZXRlckFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIpOw0KLQkJYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHBhcmFtZXRlckFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlUGFyYW1ldGVyPiB0ZW1wUGFyYW1ldGVyQW5ub3RhdGlvbiA9IHBhcmFtZXRlckFubm90YXRpb25zLml0ZXJhdG9yKCkubmV4dCgpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoImJvb2xlYW5QYXJhbSIpLCAidHJ1ZSIpOw0KLQkJDQotCQlJVmFsdWUgbmV3QlYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUoZmFsc2UpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gbmV3QlBWID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJbmV3QlBWLmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJib29sZWFuUGFyYW0iLCBuZXdCVikpOw0KLQkJQW5ub3RhdGlvbkltcGw8SVR5cGVQYXJhbWV0ZXI+IG5ld1BhcmFtZXRlckFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbkltcGw8SVR5cGVQYXJhbWV0ZXI+KCJvcmcuZWNsaXBzZS50ZXN0Lk15UGFyYW1ldGVyQW5ub3RhdGlvbiIsIG5ld0JQVik7DQotCQluZXdQYXJhbWV0ZXJBbm5vdGF0aW9uLnNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUodHlwZVBhcmFtZXRlcik7DQotCQkNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS51cGRhdGUobmV3UGFyYW1ldGVyQW5ub3RhdGlvbik7DQotCQkNCi0JCXBhcmFtZXRlckFubm90YXRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFBhcmFtKHR5cGVQYXJhbWV0ZXIpOw0KLQkJYXNzZXJ0Tm90TnVsbChwYXJhbWV0ZXJBbm5vdGF0aW9ucyk7DQotCQlhc3NlcnRUcnVlKHBhcmFtZXRlckFubm90YXRpb25zLnNpemUoKSA9PSAxKTsNCi0JCXRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uID0gcGFyYW1ldGVyQW5ub3RhdGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlhc3NlcnRFcXVhbHModGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYm9vbGVhblBhcmFtIiksICJmYWxzZSIpOw0KLQ0KLQkJbmV3QlYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVCb29sZWFuVmFsdWUodHJ1ZSk7DQotCQluZXdCUFYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQluZXdCUFYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoIm5ld2VzdEJvb2xlYW5QYXJhbSIsIG5ld0JWKSk7DQotCQluZXdQYXJhbWV0ZXJBbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25JbXBsPElUeXBlUGFyYW1ldGVyPigib3JnLmVjbGlwc2UudGVzdC5NeVBhcmFtZXRlckFubm90YXRpb24iLCBuZXdCUFYpOw0KLQkJbmV3UGFyYW1ldGVyQW5ub3RhdGlvbi5zZXRBcHBsaWVkRWxlbWVudFdpdGhvdXRTYXZlKHR5cGVQYXJhbWV0ZXIpOw0KLQkJDQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkudXBkYXRlKG5ld1BhcmFtZXRlckFubm90YXRpb24pOw0KLQ0KLQkJcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlcik7DQotCQlhc3NlcnROb3ROdWxsKHBhcmFtZXRlckFubm90YXRpb25zKTsNCi0JCWFzc2VydFRydWUocGFyYW1ldGVyQW5ub3RhdGlvbnMuc2l6ZSgpID09IDEpOw0KLQkJdGVtcFBhcmFtZXRlckFubm90YXRpb24gPSBwYXJhbWV0ZXJBbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCWFzc2VydE51bGwodGVtcFBhcmFtZXRlckFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYm9vbGVhblBhcmFtIikpOw0KLQkJYXNzZXJ0RXF1YWxzKHRlbXBQYXJhbWV0ZXJBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoIm5ld2VzdEJvb2xlYW5QYXJhbSIpLCAidHJ1ZSIpOw0KLQkJDQotCQkNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNldEFwcGxpZWRFbGVtZW50V2l0aG91dFNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCXRyeQ0KLQkJew0KLQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIG51bGwpOw0KLQkJCWZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duLiIpOw0KLQkJfQ0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpDQotCQl7DQotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdE11bHR5QWRkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBXaXRvdXRSZW1vdmUoKTsNCi0JCQ0KLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpDQotCQl7DQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCQl7DQotCQkJCXRyeQ0KLQkJCQl7DQotCQkJCQlTZXQ8U3RyaW5nPiBhbm5vU2V0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOw0KLQkJCQkJYW5ub1NldC5hZGQoIlN0YXRlbGVzcyIpOw0KLQkJCQkJDQotCQkJCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9ucyhlbmRwb2ludCwgYW5ub1NldCk7DQotCQkJCQkNCi0JCQkJCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJCQkJDQotCQkJCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQ0KLQkJCQkJSVZhbHVlIHN2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZ1ZhbHVlIik7DQotDQotCQkJCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBzcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQkJCQlzcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInN0cmluZ1BhcmFtIiwgc3YpKTsNCi0JCQkJCQ0KLQkJCQkJSUFubm90YXRpb248SVR5cGU+IHNBbm4gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15U3RyaW5nQW5ub3RhdGlvbiIsIHNwdiwgZW5kcG9pbnQpOw0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KHNBbm4sIGVuZHBvaW50KTsNCi0JCQkJCQ0KLQkJCQkJDQotCQkJCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gYW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJCQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAzKTsNCi0JCQkJCUlBbm5vdGF0aW9uPElUeXBlPiB0bXBBbm4gPSBhbm5vdGF0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCQkJCQ0KLQkJCQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZSh0bXBBbm4pOw0KLQkJCQkJDQotCQkJCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkJCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLnNpemUoKSA9PSAyKTsNCi0JCQkJCQ0KLQkJCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSBlbmRwb2ludC5nZXRNZXRob2RzKCk7DQotCQkJCQlmb3IgKElNZXRob2QgbWV0aG9kIDogbWV0aG9kcykNCi0JCQkJCXsNCi0JCQkJCQlJVmFsdWUgc212ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUoIlN0cmluZ1ZhbHVlIik7DQotCQkJCQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gc21wdiA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0JCQkJCQlzbXB2LmFkZChBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJzdHJpbmdQYXJhbSIsIHNtdikpOw0KLQkJCQkJCQ0KLQkJCQkJCUlBbm5vdGF0aW9uPElNZXRob2Q+IHNtQW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb25NZXRob2QiLCBzbXB2LCBtZXRob2QpOw0KLQkJCQkJCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChzbUFubiwgbWV0aG9kKTsNCi0JCQkJCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElNZXRob2Q+PiBhbm5vdGF0aW9uc00gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkJCQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uc00pOw0KLQkJCQkJCWFzc2VydFRydWUoYW5ub3RhdGlvbnNNLnNpemUoKSA9PSAyKTsNCi0NCi0JCQkJCQlhbm5vdGF0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkJCQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9ucyk7DQotCQkJCQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5zaXplKCkgPT0gMik7DQotDQotCQkJCQl9DQotCQ0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkNCi0JCQkJew0KLQkJCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJDQotCQlnZXRUZXN0UHJvamVjdCgpLmdldFNvdXJjZUZvbGRlcigpLmdldFJlc291cmNlKCkuZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsNCi0NCi0JCQ0KLQkJDQotCQkNCi0JfQ0KLQkJDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKQ0KLQl7DQotCQlJVmFsdWUgcXYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgcXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbjEiLCBwdiwgZW5kcG9pbnQpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbjIiLCBwdiwgZW5kcG9pbnQpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubjMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJvcmcuZWNsaXBzZS50ZXN0Lk15QW5ub3RhdGlvbjEiLCBwdiwgZW5kcG9pbnQpOw0KLQkJDQotCQlhc3NlcnRUcnVlKGFubjEuZXF1YWxzKGFubjEpKTsNCi0JCWFzc2VydEZhbHNlKGFubjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGFubjEuZXF1YWxzKHF2KSk7DQotCQlhc3NlcnRGYWxzZShhbm4xLmVxdWFscyhhbm4yKSk7DQotCQlhc3NlcnRUcnVlKGFubjEuZXF1YWxzKGFubjMpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCUlWYWx1ZSBxdiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBxdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJRmllbGQ+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50LmdldEZpZWxkKCJmaWVsZDEiKSk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5uLCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRBcHBsaWVkRWxlbWVudCgpLCBlbmRwb2ludC5nZXRGaWVsZCgiZmllbGQxIikpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvcigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXBXaXRvdXRSZW1vdmUyKCk7DQotCQkNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCJvcmcuZWNsaXBzZS5kZW1vLk15QW5ub3RhdGlvbiIpOw0KLQkJYXNzZXJ0Tm90TnVsbChpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbik7DQotCQlJTG9jYXRvciBsb2NhdG9yID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGFubm90YXRpb24gc3RhcnQgcG9zaXRpb24iLCAxOTEsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBsZW5ndGgiLCAzMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJtVmFsdWVzID0gaW5zcGVjdGVkVHlwZUFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm15VmFsdWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDIwNSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTgsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWluc3BlY3RlZFR5cGVBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7DQotCQlhc3NlcnROb3ROdWxsKGluc3BlY3RlZFR5cGVBbm5vdGF0aW9uKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgQFdlYlNlcnZpY2UgYW5ub3RhdGlvbiBzdGFydCBwb3NpdGlvbiIsIDIyNiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIEBXZWJTZXJ2aWNlIGFubm90YXRpb24gbGVuZ3RoIiwgMTM0LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRUeXBlQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygic2VydmljZU5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDIzOCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2VydmljZU5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMzEsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0NCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHNlcnZpY2VOYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMjcxLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzZXJ2aWNlTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxNywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQ0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJ0YXJnZXROYW1lc3BhY2UiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCB0YXJnZXROYW1lc3BhY2UgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCAyOTAsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHRhcmdldE5hbWVzcGFjZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0MiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQ0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJwb3J0TmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHBvcnROYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgMzM0LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBwb3J0TmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyNSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSUZpZWxkIGZpZWxkID0gZW5kcG9pbnQuZ2V0RmllbGQoImZpZWxkMSIpOw0KLQkJSUFubm90YXRpb248SUZpZWxkPiBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZmllbGQsICJvcmcuZWNsaXBzZS5kZW1vLk15RmllbGRBbm5vdGF0aW9uIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkRmllbGRBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeUZpZWxkQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDQwMSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIE15RmllbGRBbm5vdGF0aW9uIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDMzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDIwLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDEzLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0RmllbGQoZmllbGQsICJqYXZheC5qd3MuV2ViRmllbGQiKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRGaWVsZEFubm90YXRpb24uZ2V0TG9jYXRvcigpOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIFdlYkZpZWxkIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNDM3LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViRmllbGQgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMjUsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZEZpZWxkQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKTsNCi0JCWZvciAoSVBhcmFtVmFsdWVQYWlyIHBhcmFtVmFsdWVQYWlyIDogcGFybVZhbHVlcykNCi0JCXsNCi0JCQlpZihwYXJhbVZhbHVlUGFpci5nZXRQYXJhbSgpLmVxdWFscygibmFtZSIpKQ0KLQkJCXsNCi0JCQkJbG9jYXRvciA9IHBhcmFtVmFsdWVQYWlyLmdldExvY2F0b3IoKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0NDcsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG5hbWUgYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgMTQsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlNZXRob2QgbWV0aG9kID0gZW5kcG9pbnQuZ2V0TWV0aG9kcygpWzBdOw0KLQkJSUFubm90YXRpb248SU1ldGhvZD4gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RNZXRob2QobWV0aG9kLCAib3JnLmVjbGlwc2UuZGVtby5NeU1ldGhvZEFubm90YXRpb24iKTsNCi0JCWxvY2F0b3IgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldExvY2F0b3IoKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeU1ldGhvZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA0OTIsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeU1ldGhvZEFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgbGVuZ3RoIiwgNDMsIGxvY2F0b3IuZ2V0TGVuZ3RoKCkpOw0KLQkJcGFybVZhbHVlcyA9IGluc3BlY3RlZE1ldGhvZEFubm90YXRpb24uZ2V0UGFyYW1WYWx1ZVBhaXJzKCk7DQotCQlmb3IgKElQYXJhbVZhbHVlUGFpciBwYXJhbVZhbHVlUGFpciA6IHBhcm1WYWx1ZXMpDQotCQl7DQotCQkJaWYocGFyYW1WYWx1ZVBhaXIuZ2V0UGFyYW0oKS5lcXVhbHMoIm5hbWUiKSkNCi0JCQl7DQotCQkJCWxvY2F0b3IgPSBwYXJhbVZhbHVlUGFpci5nZXRMb2NhdG9yKCk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTEyLCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQkJCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBuYW1lIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDIyLCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCQl9DQotCQl9DQotDQotCQlpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdE1ldGhvZChtZXRob2QsICJqYXZheC5qd3MuV2ViTWV0aG9kIik7DQotCQlsb2NhdG9yID0gaW5zcGVjdGVkTWV0aG9kQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViTWV0aG9kIGFubm90YXRpb24gcGFyYW1ldGVyIHN0YXJ0IHBvc2l0aW9uIiwgNTM4LCBsb2NhdG9yLmdldFN0YXJ0UG9zaXRpb24oKSk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViTWV0aG9kIGFubm90YXRpb24gcGFyYW1ldGVyIGxlbmd0aCIsIDQ2LCBsb2NhdG9yLmdldExlbmd0aCgpKTsNCi0JCXBhcm1WYWx1ZXMgPSBpbnNwZWN0ZWRNZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJleGNsdWRlIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjbHVkZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDU0OSwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXhjbHVkZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAxMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQ0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJvcGVyYXRpb25OYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgb3BlcmF0aW9uTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDU2MywgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgb3BlcmF0aW9uTmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyMCwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtZXRlciA9IG1ldGhvZC5nZXRUeXBlUGFyYW1ldGVyKCJhbm5vdGF0ZWRQYXJhbSIpOw0KLQkJSUFubm90YXRpb248SVR5cGVQYXJhbWV0ZXI+IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RQYXJhbSh0eXBlUGFyYW1ldGVyLCAib3JnLmVjbGlwc2UuZGVtby5NeVBhcmFtQW5ub3RhdGlvbiIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgTXlQYXJhbUFubm90YXRpb24gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2NDksIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBNeVBhcmFtQW5ub3RhdGlvbiBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCA0MywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDY2OCwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyMywgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpbnNwZWN0ZWRQYXJhbUFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0UGFyYW0odHlwZVBhcmFtZXRlciwgImphdmF4Lmp3cy5XZWJQYXJhbSIpOw0KLQkJbG9jYXRvciA9IGluc3BlY3RlZFBhcmFtQW5ub3RhdGlvbi5nZXRMb2NhdG9yKCk7DQotCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgV2ViUGFyYW0gYW5ub3RhdGlvbiBwYXJhbWV0ZXIgc3RhcnQgcG9zaXRpb24iLCA2MTYsIGxvY2F0b3IuZ2V0U3RhcnRQb3NpdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscygiVW5leHBlY3RlZCBXZWJQYXJhbSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAzMiwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQlwYXJtVmFsdWVzID0gaW5zcGVjdGVkUGFyYW1Bbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpOw0KLQkJZm9yIChJUGFyYW1WYWx1ZVBhaXIgcGFyYW1WYWx1ZVBhaXIgOiBwYXJtVmFsdWVzKQ0KLQkJew0KLQkJCWlmKHBhcmFtVmFsdWVQYWlyLmdldFBhcmFtKCkuZXF1YWxzKCJuYW1lIikpDQotCQkJew0KLQkJCQlsb2NhdG9yID0gcGFyYW1WYWx1ZVBhaXIuZ2V0TG9jYXRvcigpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBzdGFydCBwb3NpdGlvbiIsIDYyNiwgbG9jYXRvci5nZXRTdGFydFBvc2l0aW9uKCkpOw0KLQkJCQlhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbmFtZSBhbm5vdGF0aW9uIHBhcmFtZXRlciBsZW5ndGgiLCAyMSwgbG9jYXRvci5nZXRMZW5ndGgoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Fubm90YXRpb25zVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxNDMzYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQW5ub3RhdGlvbnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQW5ub3RhdGlvbkluc3BlY3RvckltcGw7DQotDQotcHVibGljIGNsYXNzIEFubm90YXRpb25zVGVzdCBleHRlbmRzIENsYXNzTG9hZGluZ1Rlc3QNCi17DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUkMgPSAic3JjIjsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBDSyA9ICJvcmcuZWNsaXBzZS5kZW1vIjsNCi0NCi0JcHJpdmF0ZSBJVHlwZSBlbmRwb2ludDsNCi0NCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJY3JlYXRlSmF2YVByb2plY3QoU1JDLCBQQ0spOw0KLQkJZW5kcG9pbnQgPSBjcmVhdGVDbGFzcygiRW5kcG9pbnQuc3JjIiwgIkVuZHBvaW50Iik7DQotCQlBbm5vdGF0aW9uRmFjdG9yeS5yZW1vdmVBbm5vdGF0aW9uc0Zyb21KYXZhRWxlbWVudChlbmRwb2ludCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbXBsZXhBbm5vdGF0aW9uUU5WYWx1ZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotDQotCQlJUGFyYW1WYWx1ZVBhaXIgcHYgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHF2KTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2KTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYlNlcnZpY2UiLCBwYXJhbVZhbHVlcywgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIGVuZHBvaW50KTsNCi0NCi0JCWFzc2VydFRydWUoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKS5zaXplKCkgPiAwKTsNCi0JfQ0KLQ0KLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTaW5nbGVFbGVtZW50QW5ub3RhdGlvbkFycmF5VmFsdWVzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLS8vCXsNCi0vLwkJSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVNpbmdsZUVsZW1lbnRBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIG5ldyBTdHJpbmdbXSB7ICJ2YWwxIiwgInZhbDIiIH0pOw0KLS8vCQlhbm5vdGF0aW9uLmFkZFRvQ2xhc3MoZW5kcG9pbnQpOw0KLS8vDQotLy8JCWFzc2VydFRydWUoQW5ub3RhdGlvbkZhY3RvcnkuZ2V0QW5ub3RhdGlvbnNGcm9tQ2xhc3MoZW5kcG9pbnQpLmxlbmd0aCA+IDApOw0KLS8vCX0NCi0vLw0KLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTaW1wbGVBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLS8vCXsNCi0vLwkJSUFubm90YXRpb24gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVNpbXBsZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJTZXJ2aWNlIik7DQotLy8JCWFubm90YXRpb24uYWRkVG9DbGFzcyhlbmRwb2ludCk7DQotLy8NCi0vLwkJYXNzZXJ0VHJ1ZShBbm5vdGF0aW9uRmFjdG9yeS5nZXRBbm5vdGF0aW9uc0Zyb21DbGFzcyhlbmRwb2ludCkubGVuZ3RoID4gMCk7DQotLy8JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IGFubm90YXRpb24gYW5kIGFkZHMgaXQgdG8gY2xhc3MuIFRoZSBhbm5vdGF0aW9uIGhhcyB0aGUgZm9ybToNCi0JICogDQotCSAqIDxwcmU+DQotCSAqIAkgQFdlYlNlcnZpY2Uoc2VydmljZU5hbWU9JnF1b3Q7c2VydmljZU5hbWUmcXVvdDssDQotCSAqIAkgbmFtZT0mcXVvdDtwb3J0VHlwZU5hbWUmcXVvdDssDQotCSAqIAkgdGFyZ2V0TmFtZXNwYWNlPSZxdW90O2h0dHA6Ly9kZW1vLnNhcC5jb20vJnF1b3Q7LA0KLQkgKiAJIHdzZGxMb2NhdGlvbj0mcXVvdDtodHRwOi8vd3NkbC91cmwvJnF1b3Q7LA0KLQkgKiAJIHBvcnROYW1lPSZxdW90O3BvcnROYW1lJnF1b3Q7LA0KLQkgKiAJIGVuZHBvaW50SW50ZXJmYWNlPSZxdW90O29yZy5lY2xpcHNlLmRlbW8uSVNlaSZxdW90OykNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4Q2xhc3NBbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlTZXQ8SVBhcmFtVmFsdWVQYWlyPiBwYXJhbVZhbHVlcyA9IG5ldyBIYXNoU2V0PElQYXJhbVZhbHVlUGFpcj4oKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAic2VydmljZU5hbWUiLCAic2VydmljZU5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAibmFtZSIsICJwb3J0VHlwZU5hbWUiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAidGFyZ2V0TmFtZXNwYWNlIiwgImh0dHA6Ly9kZW1vLnNhcC5jb20vIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgIndzZGxMb2NhdGlvbiIsICJodHRwOi8vd3NkbC91cmwvIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInBvcnROYW1lIiwgInBvcnROYW1lIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgImVuZHBvaW50SW50ZXJmYWNlIiwgIm9yZy5lY2xpcHNlLmRlbW8uSVNlaSIpOw0KLQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24gPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJqYXZheC5qd3MuV2ViU2VydmljZSIsIHBhcmFtVmFsdWVzLCBlbmRwb2ludCk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkuc2V0QXBwbGllZEVsZW1lbnQoYW5ub3RhdGlvbiwgZW5kcG9pbnQpOw0KLQ0KLQkJQW5ub3RhdGlvbkluc3BlY3RvckltcGwgYW5ub3RhdGlvbkluc3BlY3RvciA9IG5ldyBBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbChlbmRwb2ludCk7DQotCQlDb2xsZWN0aW9uPElBbm5vdGF0aW9uPElUeXBlPj4gdHlwZUFubm90YXRpb25zID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0VHlwZSgpOw0KLQ0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsNCi0JCWZvciAoSUFubm90YXRpb248SVR5cGU+IHR5cGVBbm5vdGF0aW9uIDogdHlwZUFubm90YXRpb25zKQ0KLQkJew0KLQkJCWlmKHR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViU2VydmljZSIpIHx8IHR5cGVBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJXZWJTZXJ2aWNlIikpDQotCQkJew0KLQkJCQlpZih0eXBlQW5ub3RhdGlvbi5nZXRQYXJhbVZhbHVlUGFpcnMoKS5zaXplKCkgIT0gNikNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInNlcnZpY2VOYW1lIikuZXF1YWxzKCJzZXJ2aWNlTmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgibmFtZSIpLmVxdWFscygicG9ydFR5cGVOYW1lIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ0YXJnZXROYW1lc3BhY2UiKS5lcXVhbHMoImh0dHA6Ly9kZW1vLnNhcC5jb20vIikpDQotCQkJCXsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCWlmKCF0eXBlQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJ3c2RsTG9jYXRpb24iKS5lcXVhbHMoImh0dHA6Ly93c2RsL3VybC8iKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIXR5cGVBbm5vdGF0aW9uLmdldFByb3BlcnR5VmFsdWUoInBvcnROYW1lIikuZXF1YWxzKCJwb3J0TmFtZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighdHlwZUFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiZW5kcG9pbnRJbnRlcmZhY2UiKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmRlbW8uSVNlaSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJDQotCQkJCXJlc3VsdCA9IHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiQ2xhc3MgaXMgbm90IGFubm90YXRlZCBjb3JyZWN0bHkiLCByZXN1bHQpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGNvbXBsZXggYW5ub3RhdGlvbiBhbmQgYWRkcyBpdCB0byBtZXRob2QgZGVjbGFyYXRpb24uIEFubm90YXRpb24gaGFzIHRoZSBmb3JtOg0KLQkgKiANCi0JICogPHByZT4NCi0JICogIFxAV2ViTWV0aG9kKGV4Y2x1ZGU9ZmFsc2Usb3BlcmF0aW9uTmFtZT0mcXVvdDthbm5vdGF0ZWRNZXRob2QmcXVvdDssYWN0aW9uPSZxdW90O2dvJnF1b3Q7KQkNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4TWV0aG9kQW5ub3RhdGlvbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0Jew0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotDQotCQlJVmFsdWUgZW1WYWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUJvb2xlYW5WYWx1ZShmYWxzZSk7DQotCQlwYXJhbVZhbHVlcy5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgiZXhjbHVkZSIsIGVtVmFsdWUpKTsNCi0NCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAib3BlcmF0aW9uTmFtZSIsICJhbm5vdGF0ZWRNZXRob2QiKTsNCi0JCWFkZFN0cmluZ1Byb3BlcnR5KHBhcmFtVmFsdWVzLCAiYWN0aW9uIiwgImdvIik7DQotDQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCQkJDQotCQlJQW5ub3RhdGlvbjxJTWV0aG9kPiBhbm5vdGF0aW9uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiamF2YXguandzLldlYk1ldGhvZCIsIHBhcmFtVmFsdWVzLCBtZXRob2QpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubm90YXRpb24sIG1ldGhvZCk7DQotDQotCQlBbm5vdGF0aW9uSW5zcGVjdG9ySW1wbCBhbm5vdGF0aW9uSW5zcGVjdG9yID0gbmV3IEFubm90YXRpb25JbnNwZWN0b3JJbXBsKGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SU1ldGhvZD4+IG1ldGhvZEFubm90YXRpb25zID0gYW5ub3RhdGlvbkluc3BlY3Rvci5pbnNwZWN0TWV0aG9kKG1ldGhvZCk7DQotCQkgCQkNCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7DQotCQlmb3IgKElBbm5vdGF0aW9uPElNZXRob2Q+IG1ldGhvZEFubm90YXRpb24gOiBtZXRob2RBbm5vdGF0aW9ucykNCi0JCXsNCi0JCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKCJqYXZheC5qd3MuV2ViTWV0aG9kIikgfHwgbWV0aG9kQW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscygiV2ViTWV0aG9kIikpDQotCQkJew0KLQkJCQlpZihtZXRob2RBbm5vdGF0aW9uLmdldFBhcmFtVmFsdWVQYWlycygpLnNpemUoKSAhPSAzKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJleGNsdWRlIikuZXF1YWxzKCJmYWxzZSIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCQlpZighbWV0aG9kQW5ub3RhdGlvbi5nZXRQcm9wZXJ0eVZhbHVlKCJvcGVyYXRpb25OYW1lIikuZXF1YWxzKCJhbm5vdGF0ZWRNZXRob2QiKSkNCi0JCQkJew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQkJaWYoIW1ldGhvZEFubm90YXRpb24uZ2V0UHJvcGVydHlWYWx1ZSgiYWN0aW9uIikuZXF1YWxzKCJnbyIpKQ0KLQkJCQl7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJDQotCQkJCXJlc3VsdCA9IHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiTWV0aG9kIGlzIG5vdCBhbm5vdGF0ZWQgY29ycmVjdGx5IiwgcmVzdWx0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBjb21wbGV4IGFubm90YXRpb24gYW5kIGFkZHMgaXQgdG8gYSBtZXRob2QgcGFyYW1ldGVyLiBUaGUgYW5ub3RhdGlvbiBoYXMgdGhlIGZvcm06DQotCSAqIA0KLQkgKiA8cHJlPg0KLQkgKiAgXEBXZWJQYXJhbShvcGVyYXRpb25OYW1lPSZxdW90O2Fubm90YXRlZFBhcmFtJnF1b3Q7LCB0YXJnZXROYW1lc3BhY2U9JnF1b3Q7aHR0cDovL2RlbW8uc2FwLmNvbS9wYXJhbXMvJnF1b3Q7LCBwYXJ0TmFtZT0mcXVvdDtwYXJ0TmFtZSZxdW90OykNCi0JICogPC9wcmU+DQotCSAqIA0KLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbg0KLQkgKiBAdGhyb3dzIEFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb21wbGV4UGFyYW1Bbm5vdGF0aW9uKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQlJTWV0aG9kIG1ldGhvZCA9IGVuZHBvaW50LmdldE1ldGhvZCgiYW5ub3RhdGVkTWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsgIlFTdHJpbmc7IiB9KTsNCi0JCUlUeXBlUGFyYW1ldGVyIHR5cGVQYXJhbWV0ZXIgPSBtZXRob2QuZ2V0VHlwZVBhcmFtZXRlcigiYW5ub3RhdGVkUGFyYW0iKTsNCi0NCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQ0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJhbm5vdGF0ZWRQYXJhbSIsICJwYXJhbSIpOw0KLQkJYWRkU3RyaW5nUHJvcGVydHkocGFyYW1WYWx1ZXMsICJ0YXJnZXROYW1lc3BhY2UiLCAiaHR0cDovL2RlbW8uc2FwLmNvbS9wYXJhbXMvIik7DQotCQlhZGRTdHJpbmdQcm9wZXJ0eShwYXJhbVZhbHVlcywgInBhcnROYW1lIiwgInBhcnROYW1lIik7DQotDQotCQlJQW5ub3RhdGlvbjxJVHlwZVBhcmFtZXRlcj4gYW5ub3RhdGlvbiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImphdmF4Lmp3cy5XZWJQYXJhbSIsIHBhcmFtVmFsdWVzLCB0eXBlUGFyYW1ldGVyKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm5vdGF0aW9uLCB0eXBlUGFyYW1ldGVyKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgYWRkU3RyaW5nUHJvcGVydHkoU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHZhbHVlKQ0KLQl7DQotCQlJVmFsdWUgcFZhbHVlID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlU3RyaW5nVmFsdWUodmFsdWUpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHBhaXIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKHByb3BlcnR5LCBwVmFsdWUpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHBhaXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0FycmF5VmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGJmNWU0ZGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQXJyYXlWYWx1ZUltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXJyYXlWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgQXJyYXlWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMxID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMS5jbGVhcigpOw0KLQkJdmFsdWVzMS5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MSA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMxKTsNCi0JCQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMiA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczIuY2xlYXIoKTsNCi0JCXZhbHVlczIuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDIiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjIgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMik7DQotDQotCQlhc3NlcnRUcnVlKGF2MS5oYXNoQ29kZSgpICE9IGF2Mi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlWYWx1ZUltcGwoKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQluZXcgQXJyYXlWYWx1ZUltcGwobnVsbCk7DQotCQkJZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gbm90IHRocm93biIpOw0KLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkNCi0JCXsNCi0JCQlhc3NlcnRUcnVlKHRydWUpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMxID0gbmV3IEhhc2hTZXQ8SVZhbHVlPigpOw0KLQkJdmFsdWVzMS5jbGVhcigpOw0KLQkJdmFsdWVzMS5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2MSA9IG5ldyBBcnJheVZhbHVlSW1wbCh2YWx1ZXMxKTsNCi0NCi0JCVNldDxJVmFsdWU+IHZhbHVlczIgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMyLmNsZWFyKCk7DQotCQl2YWx1ZXMyLmFkZChuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWwyIikpOw0KLQkJQXJyYXlWYWx1ZUltcGwgYXYyID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlczIpOw0KLQ0KLQkJU2V0PElWYWx1ZT4gdmFsdWVzMyA9IG5ldyBIYXNoU2V0PElWYWx1ZT4oKTsNCi0JCXZhbHVlczMuY2xlYXIoKTsNCi0JCXZhbHVlczMuYWRkKG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbDEiKSk7DQotCQlBcnJheVZhbHVlSW1wbCBhdjMgPSBuZXcgQXJyYXlWYWx1ZUltcGwodmFsdWVzMyk7DQotDQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKGF2MS5lcXVhbHMoMTIzKSk7DQotCQlhc3NlcnRGYWxzZShhdjEuZXF1YWxzKGF2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhdjEuZXF1YWxzKGF2MykpOw0KLQkJYXNzZXJ0VHJ1ZShhdjEuZXF1YWxzKGF2MSkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlzKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlTZXQ8SVZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaFNldDxJVmFsdWU+KCk7DQotCQl2YWx1ZXMuY2xlYXIoKTsNCi0JCXZhbHVlcy5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMSIpKTsNCi0JCXZhbHVlcy5hZGQobmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsMiIpKTsNCi0JCUFycmF5VmFsdWVJbXBsIGF2ID0gbmV3IEFycmF5VmFsdWVJbXBsKHZhbHVlcyk7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBhdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0Jvb2xlYW5WYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Cb29sZWFuVmFsdWVJbXBsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGFkOGVhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Cb29sZWFuVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuQXJyYXlWYWx1ZUltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkJvb2xlYW5WYWx1ZUltcGw7DQotDQotcHVibGljIGNsYXNzIEJvb2xlYW5WYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhblZhbHVlSW1wbCgpDQotCXsNCi0JCXRyeQ0KLQkJew0KLQkJCW5ldyBBcnJheVZhbHVlSW1wbChudWxsKTsNCi0JCQlmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBub3QgdGhyb3duIik7DQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKQ0KLQkJew0KLQkJCWFzc2VydFRydWUodHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlzZXRVcCgpOw0KLQkJDQotCQlCb29sZWFuVmFsdWVJbXBsIGJ2ID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwodHJ1ZSk7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBidikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJQm9vbGVhblZhbHVlSW1wbCBidjEgPSBuZXcgQm9vbGVhblZhbHVlSW1wbCh0cnVlKTsNCi0JCUJvb2xlYW5WYWx1ZUltcGwgYnYyID0gbmV3IEJvb2xlYW5WYWx1ZUltcGwoZmFsc2UpOw0KLQkJQm9vbGVhblZhbHVlSW1wbCBidjMgPSBuZXcgQm9vbGVhblZhbHVlSW1wbCh0cnVlKTsNCi0NCi0JCWFzc2VydEZhbHNlKGJ2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYnYxLmVxdWFscygxMjMpKTsNCi0JCWFzc2VydEZhbHNlKGJ2MS5lcXVhbHMoYnYyKSk7DQotDQotCQlhc3NlcnRUcnVlKGJ2MS5lcXVhbHMoYnYzKSk7DQotCQlhc3NlcnRUcnVlKGJ2MS5lcXVhbHMoYnYxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvQ2xhc3NWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9DbGFzc1ZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQwMGEyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9DbGFzc1ZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5wcm9qZWN0LkNsYXNzTG9hZGluZ1Rlc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25HZW5lcmF0b3JFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uV3JpdGVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSUFubm90YXRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JUGFyYW1WYWx1ZVBhaXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLkNsYXNzVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBDbGFzc1ZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VycygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJQ2xhc3NWYWx1ZUltcGwgY3YgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgY3YpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKS50b1N0cmluZygpLCBlbmRwb2ludC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7DQotCQlBbm5vdGF0aW9uV3JpdGVyLmdldEluc3RhbmNlKCkucmVtb3ZlKGFubik7DQotCQlhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlDbGFzc1ZhbHVlSW1wbCBjdjEgPSBuZXcgQ2xhc3NWYWx1ZUltcGwoZW5kcG9pbnQuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOw0KLQkJQ2xhc3NWYWx1ZUltcGwgY3YyID0gbmV3IENsYXNzVmFsdWVJbXBsKG51bGwpOw0KLQkJQ2xhc3NWYWx1ZUltcGwgY3YzID0gbmV3IENsYXNzVmFsdWVJbXBsKGVuZHBvaW50LmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsNCi0NCi0JCWFzc2VydEZhbHNlKGN2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoY3YxLmVxdWFscyh0cnVlKSk7DQotCQlhc3NlcnRGYWxzZShjdjEuZXF1YWxzKGN2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShjdjEuZXF1YWxzKGN2MykpOw0KLQkJYXNzZXJ0VHJ1ZShjdjEuZXF1YWxzKGN2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0NvbXBsZXhBbm5vdGF0aW9uSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmY1NmQyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9Db21wbGV4QW5ub3RhdGlvbkltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7DQotaW1wb3J0IGphdmEudXRpbC5TZXQ7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLmptb2NrLk1vY2s7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy50ZXN0dXRpbHMuam1vY2suTW9ja09iamVjdFRlc3RDYXNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQ29tcGxleEFubm90YXRpb25JbXBsVGVzdCBleHRlbmRzIE1vY2tPYmplY3RUZXN0Q2FzZQ0KLXsJDQotCXByaXZhdGUgTW9jazxJVHlwZT4gdHlwZUVsZW1lbnQgPSBtb2NrKElUeXBlLmNsYXNzKTsNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpDQotCXsNCi0JCUlWYWx1ZSB2YWx1ZSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVN0cmluZ1ZhbHVlKCJ2YWx1ZSIpOw0KLQkJSVBhcmFtVmFsdWVQYWlyIHB2cCA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgdmFsdWUpOw0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcGFyYW1WYWx1ZXMgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwYXJhbVZhbHVlcy5hZGQocHZwKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubm90YXRpb24yID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3RhdGlvbk5hbWUyIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5oYXNoQ29kZSgpICE9IGFubm90YXRpb24yLmhhc2hDb2RlKCkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNPYmplY3QoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVTdHJpbmdWYWx1ZSgidmFsdWUiKTsNCi0JCUlQYXJhbVZhbHVlUGFpciBwdnAgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlUGFpclZhbHVlKCJwYXJhbSIsIHZhbHVlKTsNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHBhcmFtVmFsdWVzID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcGFyYW1WYWx1ZXMuYWRkKHB2cCk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5ub3RhdGlvbjEgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdGF0aW9uTmFtZSIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lMiIsIHBhcmFtVmFsdWVzLCB0eXBlRWxlbWVudC5wcm94eSgpKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiBhbm5vdGF0aW9uMyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oImFubm90YXRpb25OYW1lIiwgcGFyYW1WYWx1ZXMsIHR5cGVFbGVtZW50LnByb3h5KCkpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKGFubm90YXRpb24yKSk7DQotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uMS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbjEuZXF1YWxzKDEyMykpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uMS5lcXVhbHMoYW5ub3RhdGlvbjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9FbmRwb2ludC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNjk5YjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnQuc3JjCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOw0KLQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJXU0ltcGxCZWFuU2VydmljZSIsIG5hbWU9IldTSW1wbEJlYW4iLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vL2VjbGlwc2Uvb3JnLyIsIHBvcnROYW1lPSJXU0ltcGxCZWFuUG9ydCIpDQotQFN0YXRlbGVzcw0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludA0KLXsNCi0JQE15QW5ub3RhdGlvbihuYW1lPSJmaWVsZDEiKQ0KLQlwdWJsaWMgU3RyaW5nIGZpZWxkMTsNCi0JDQotCUBXZWJNZXRob2QoZXhjbHVkZT1mYWxzZSxvcGVyYXRpb25OYW1lPSJ0ZXN0IikNCi0JcHVibGljIHZvaWQgYW5ub3RhdGVkTWV0aG9kKCBAV2ViUGFyYW0obmFtZT0iYW5ub3RhdGVkUGFyYW0iKSBTdHJpbmcgYW5ub3RhdGVkUGFyYW0pIA0KLQl7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvRW5kcG9pbnRBbm5JbnNwZWN0b3Iuc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkMjUwZDU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL0VuZHBvaW50QW5uSW5zcGVjdG9yLnNyYworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi1pbXBvcnQgamF2YXguandzLldlYlNlcnZpY2U7DQotaW1wb3J0IGphdmF4Lmp3cy5XZWJGaWVsZDsNCi1pbXBvcnQgamF2YXguandzLldlYk1ldGhvZDsNCi1pbXBvcnQgamF2YXguandzLldlYlBhcmFtOw0KLQ0KLUBNeUFubm90YXRpb24obXlWYWx1ZT0iTXlTdHJpbmciKQ0KLUBXZWJTZXJ2aWNlKHNlcnZpY2VOYW1lPSJXU0ltcGxCZWFuU2VydmljZSIsIG5hbWU9IldTSW1wbEJlYW4iLCB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9kZW1vL2VjbGlwc2Uvb3JnLyIsIHBvcnROYW1lPSJXU0ltcGxCZWFuUG9ydCIpDQotQFN0YXRlbGVzcw0KLXB1YmxpYyBjbGFzcyBFbmRwb2ludA0KLXsNCi0JQE15RmllbGRBbm5vdGF0aW9uKG5hbWU9ImZpZWxkMSIpDQotCUBXZWJGaWVsZChuYW1lPSJNeUZpZWxkIikNCi0JcHVibGljIFN0cmluZyBmaWVsZDE7DQotCQ0KLQlATXlNZXRob2RBbm5vdGF0aW9uKG5hbWU9ImFubm90YXRlZE1ldGhvZCIpDQotCUBXZWJNZXRob2QoZXhjbHVkZT1mYWxzZSxvcGVyYXRpb25OYW1lPSJ0ZXN0IikNCi0JcHVibGljIHZvaWQgYW5ub3RhdGVkTWV0aG9kKCBAV2ViUGFyYW0obmFtZT0iYW5ub3RhdGVkUGFyYW0iKSBATXlQYXJhbUFubm90YXRpb24obmFtZT0iYW5ub3RhdGVkTXlQYXJhbSIpIFN0cmluZyBhbm5vdGF0ZWRQYXJhbSkgDQotCXsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JbnRlZ2VyVmFsdWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvSW50ZWdlclZhbHVlSW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhkOGNjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9JbnRlZ2VyVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuSW50ZWdlclZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgSW50ZWdlclZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBDbGFzc0xvYWRpbmdUZXN0DQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gInNyYyI7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQ0sgPSAib3JnLmVjbGlwc2UuZGVtbyI7DQotDQotCXByaXZhdGUgSVR5cGUgZW5kcG9pbnQ7DQotDQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbm5vdGF0aW9uR2VuZXJhdG9yRXhjZXB0aW9uDQotCXsNCi0JCWNyZWF0ZUphdmFQcm9qZWN0KFNSQywgUENLKTsNCi0JCWVuZHBvaW50ID0gY3JlYXRlQ2xhc3MoIkVuZHBvaW50LnNyYyIsICJFbmRwb2ludCIpOw0KLQkJQW5ub3RhdGlvbkZhY3RvcnkucmVtb3ZlQW5ub3RhdGlvbnNGcm9tSmF2YUVsZW1lbnQoZW5kcG9pbnQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VycygpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJc2V0VXAoKTsNCi0JCQ0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdiA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMCIpOw0KLQkJCQkNCi0JCVNldDxJUGFyYW1WYWx1ZVBhaXI+IHB2ID0gbmV3IEhhc2hTZXQ8SVBhcmFtVmFsdWVQYWlyPigpOw0KLQkJcHYuYWRkKEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVBhcmFtVmFsdWVQYWlyVmFsdWUoInBhcmFtIiwgaXYpKTsNCi0JCQ0KLQkJSUFubm90YXRpb248SVR5cGU+IGFubiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb24oIm9yZy5lY2xpcHNlLnRlc3QuTXlBbm5vdGF0aW9uIiwgcHYsIGVuZHBvaW50KTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5zZXRBcHBsaWVkRWxlbWVudChhbm4sIGVuZHBvaW50KTsNCi0JCUNvbGxlY3Rpb248SUFubm90YXRpb248SVR5cGU+PiBhbm5vdGF0dGlvbnMgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVBbm5vdGF0aW9uSW5zcGVjdG9yKGVuZHBvaW50KS5pbnNwZWN0VHlwZSgpOw0KLQkJDQotCQlhc3NlcnROb3ROdWxsKGFubm90YXR0aW9ucyk7DQotCQlhc3NlcnRUcnVlKGFubm90YXR0aW9ucy5zaXplKCkgPT0gMSk7DQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gcmVhZEFubm90YXRpb24gPSBhbm5vdGF0dGlvbnMuaXRlcmF0b3IoKS5uZXh0KCk7DQotCQlyZWFkQW5ub3RhdGlvbi5lcXVhbHMoYW5uKTsNCi0JCWFzc2VydEVxdWFscyhhbm4uZ2V0UHJvcGVydHlWYWx1ZSgicGFyYW0iKS50b1N0cmluZygpLCAiMTAiKTsNCi0JCUFubm90YXRpb25Xcml0ZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmUoYW5uKTsNCi0JCWFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEVxdWFsc09iamVjdCgpDQotCXsNCi0JCUludGVnZXJWYWx1ZUltcGwgaXYxID0gbmV3IEludGVnZXJWYWx1ZUltcGwoIjEwIik7DQotCQlJbnRlZ2VyVmFsdWVJbXBsIGl2MiA9IG5ldyBJbnRlZ2VyVmFsdWVJbXBsKCIxMSIpOw0KLQkJSW50ZWdlclZhbHVlSW1wbCBpdjMgPSBuZXcgSW50ZWdlclZhbHVlSW1wbCgiMTAiKTsNCi0NCi0JCWFzc2VydEZhbHNlKGl2MS5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UoaXYxLmVxdWFscyh0cnVlKSk7DQotCQlhc3NlcnRGYWxzZShpdjEuZXF1YWxzKGl2MikpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShpdjEuZXF1YWxzKGl2MykpOw0KLQkJYXNzZXJ0VHJ1ZShpdjEuZXF1YWxzKGl2MSkpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1BhcmFtVmFsdWVQYWlySW1wbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzJlYjYyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9QYXJhbVZhbHVlUGFpckltcGxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5hbm5vdGF0aW9uczsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuSVZhbHVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuaW50ZXJuYWwuYW5ub3RhdGlvbnMuaW1wbC5QYXJhbVZhbHVlUGFpckltcGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5pbnRlcm5hbC5hbm5vdGF0aW9ucy5pbXBsLlN0cmluZ1ZhbHVlSW1wbDsNCi0NCi1wdWJsaWMgY2xhc3MgUGFyYW1WYWx1ZVBhaXJJbXBsVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKQ0KLQl7DQotCQlJVmFsdWUgdmFsdWUgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cCA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtIiwgdmFsdWUpOw0KLQ0KLQkJSVZhbHVlIHZhbHVlMSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoInZhbHVlMSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDEgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbTEiLCB2YWx1ZTEpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocHZwLmhhc2hDb2RlKCkgPT0gcHZwMS5oYXNoQ29kZSgpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMobnVsbCkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscygxMjMpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHZhbHVlID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUiKTsNCi0JCVBhcmFtVmFsdWVQYWlySW1wbCBwdnAgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlKTsNCi0NCi0JCUlWYWx1ZSB2YWx1ZTEgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCJ2YWx1ZSIpOw0KLQkJUGFyYW1WYWx1ZVBhaXJJbXBsIHB2cDEgPSBuZXcgUGFyYW1WYWx1ZVBhaXJJbXBsKCJwYXJhbSIsIHZhbHVlMSk7DQotDQotCQlJVmFsdWUgdmFsdWUyID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgidmFsdWUyIik7DQotCQlQYXJhbVZhbHVlUGFpckltcGwgcHZwMiA9IG5ldyBQYXJhbVZhbHVlUGFpckltcGwoInBhcmFtMiIsIHZhbHVlMik7DQotDQotCQlhc3NlcnRUcnVlKHB2cC5lcXVhbHMocHZwMSkpOw0KLQkJYXNzZXJ0RmFsc2UocHZwLmVxdWFscyhwdnAyKSk7DQotCQlhc3NlcnRUcnVlKHB2cC5lcXVhbHMocHZwKSk7DQotDQotCQlhc3NlcnRGYWxzZShwdnAuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHB2cC5lcXVhbHMoMTIzKSk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL2Fubm90YXRpb25zL1F1YWxpZmllZE5hbWVWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ3NjExOWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIA0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICoNCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzLmludGVybmFsLmFubm90YXRpb25zOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5Bbm5vdGF0aW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklWYWx1ZTsNCi0NCi1wdWJsaWMgY2xhc3MgUXVhbGlmaWVkTmFtZVZhbHVlSW1wbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQ0KLXsNCi0NCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkNCi0Jew0KLQkJSVZhbHVlIHF2MSA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZTEiKTsNCi0JCUlWYWx1ZSBxdjIgPSBBbm5vdGF0aW9uRmFjdG9yeS5jcmVhdGVRdWFsaWZpZWROYW1lVmFsdWUoImZ1bGwucXVhbGlmaWVkLk5hbWUiKTsNCi0NCi0JCWFzc2VydEZhbHNlKHF2MS5oYXNoQ29kZSgpID09IHF2Mi5oYXNoQ29kZSgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJSVZhbHVlIHF2ID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lIik7DQotCQlJVmFsdWUgcXYxID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUXVhbGlmaWVkTmFtZVZhbHVlKCJmdWxsLnF1YWxpZmllZC5OYW1lMSIpOw0KLQkJSVZhbHVlIHF2MiA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZVF1YWxpZmllZE5hbWVWYWx1ZSgiZnVsbC5xdWFsaWZpZWQuTmFtZSIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKHF2MSkpOw0KLQkJYXNzZXJ0VHJ1ZShxdi5lcXVhbHMocXYyKSk7DQotCQlhc3NlcnRUcnVlKHF2LmVxdWFscyhxdikpOw0KLQkJYXNzZXJ0RmFsc2UocXYuZXF1YWxzKG51bGwpKTsNCi0JCWFzc2VydEZhbHNlKHF2LmVxdWFscygxMjMpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9TdHJpbmdWYWx1ZUltcGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9hbm5vdGF0aW9ucy9TdHJpbmdWYWx1ZUltcGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFkMTliMDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvYW5ub3RhdGlvbnMvU3RyaW5nVmFsdWVJbXBsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKg0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMuaW50ZXJuYWwuYW5ub3RhdGlvbnM7DQotDQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsNCi1pbXBvcnQgamF2YS51dGlsLlNldDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuQ2xhc3NMb2FkaW5nVGVzdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMuYW5ub3RhdGlvbnMuQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLkFubm90YXRpb25Xcml0ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5hbm5vdGF0aW9ucy5JQW5ub3RhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmFubm90YXRpb25zLklQYXJhbVZhbHVlUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLmludGVybmFsLmFubm90YXRpb25zLmltcGwuU3RyaW5nVmFsdWVJbXBsOw0KLQ0KLXB1YmxpYyBjbGFzcyBTdHJpbmdWYWx1ZUltcGxUZXN0IGV4dGVuZHMgQ2xhc3NMb2FkaW5nVGVzdA0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNSQyA9ICJzcmMiOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLmRlbW8iOw0KLQ0KLQlwcml2YXRlIElUeXBlIGVuZHBvaW50Ow0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQW5ub3RhdGlvbkdlbmVyYXRvckV4Y2VwdGlvbg0KLQl7DQotCQljcmVhdGVKYXZhUHJvamVjdChTUkMsIFBDSyk7DQotCQllbmRwb2ludCA9IGNyZWF0ZUNsYXNzKCJFbmRwb2ludC5zcmMiLCAiRW5kcG9pbnQiKTsNCi0JCUFubm90YXRpb25GYWN0b3J5LnJlbW92ZUFubm90YXRpb25zRnJvbUphdmFFbGVtZW50KGVuZHBvaW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcnMoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXNldFVwKCk7DQotCQkNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdiA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjEwIik7DQotCQkJCQ0KLQkJU2V0PElQYXJhbVZhbHVlUGFpcj4gcHYgPSBuZXcgSGFzaFNldDxJUGFyYW1WYWx1ZVBhaXI+KCk7DQotCQlwdi5hZGQoQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZVBhaXJWYWx1ZSgicGFyYW0iLCBzdikpOw0KLQkJDQotCQlJQW5ub3RhdGlvbjxJVHlwZT4gYW5uID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbigib3JnLmVjbGlwc2UudGVzdC5NeUFubm90YXRpb24iLCBwdiwgZW5kcG9pbnQpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnNldEFwcGxpZWRFbGVtZW50KGFubiwgZW5kcG9pbnQpOw0KLQkJQ29sbGVjdGlvbjxJQW5ub3RhdGlvbjxJVHlwZT4+IGFubm90YXR0aW9ucyA9IEFubm90YXRpb25GYWN0b3J5LmNyZWF0ZUFubm90YXRpb25JbnNwZWN0b3IoZW5kcG9pbnQpLmluc3BlY3RUeXBlKCk7DQotCQkNCi0JCWFzc2VydE5vdE51bGwoYW5ub3RhdHRpb25zKTsNCi0JCWFzc2VydFRydWUoYW5ub3RhdHRpb25zLnNpemUoKSA9PSAxKTsNCi0JCUlBbm5vdGF0aW9uPElUeXBlPiByZWFkQW5ub3RhdGlvbiA9IGFubm90YXR0aW9ucy5pdGVyYXRvcigpLm5leHQoKTsNCi0JCXJlYWRBbm5vdGF0aW9uLmVxdWFscyhhbm4pOw0KLQkJYXNzZXJ0RXF1YWxzKGFubi5nZXRQcm9wZXJ0eVZhbHVlKCJwYXJhbSIpLnRvU3RyaW5nKCksICIxMCIpOw0KLQkJQW5ub3RhdGlvbldyaXRlci5nZXRJbnN0YW5jZSgpLnJlbW92ZShhbm4pOw0KLQkJYW5ub3RhdHRpb25zID0gQW5ub3RhdGlvbkZhY3RvcnkuY3JlYXRlQW5ub3RhdGlvbkluc3BlY3RvcihlbmRwb2ludCkuaW5zcGVjdFR5cGUoKTsNCi0JCQ0KLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0dGlvbnMpOw0KLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0dGlvbnMuc2l6ZSgpID09IDApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkNCi0Jew0KLQkJU3RyaW5nVmFsdWVJbXBsIHN2MSA9IG5ldyBTdHJpbmdWYWx1ZUltcGwoIjEwIik7DQotCQlTdHJpbmdWYWx1ZUltcGwgc3YyID0gbmV3IFN0cmluZ1ZhbHVlSW1wbCgiMTEiKTsNCi0JCVN0cmluZ1ZhbHVlSW1wbCBzdjMgPSBuZXcgU3RyaW5nVmFsdWVJbXBsKCIxMCIpOw0KLQ0KLQkJYXNzZXJ0RmFsc2Uoc3YxLmVxdWFscyhudWxsKSk7DQotCQlhc3NlcnRGYWxzZShzdjEuZXF1YWxzKHRydWUpKTsNCi0JCWFzc2VydEZhbHNlKHN2MS5lcXVhbHMoc3YyKSk7DQotDQotCQlhc3NlcnRUcnVlKHN2MS5lcXVhbHMoc3YzKSk7DQotCQlhc3NlcnRUcnVlKHN2MS5lcXVhbHMoc3YxKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvY2xhenovQVNUVXRpbHNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9jbGF6ei9BU1RVdGlsc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NkNThjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudXRpbHMudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9qYXh3cy91dGlscy90ZXN0cy9pbnRlcm5hbC9jbGF6ei9BU1RVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwOSBieSBTQVAgQUcsIFdhbGxkb3JmLiANCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy5pbnRlcm5hbC5jbGF6ejsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnRlc3R1dGlscy5maWxlcy5UZXN0RmlsZVV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuamF4d3MudGVzdHV0aWxzLnByb2plY3QuVGVzdFByb2plY3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy5jbGF6ei5BU1RVdGlsczsNCi0NCi0vKioNCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEFTVFV0aWxzfSBjbGFzcy4NCi0gKiANCi0gKiBAYXV0aG9yIEdlb3JnaSBWYWNoa292DQotICovDQotcHVibGljIGNsYXNzIEFTVFV0aWxzVGVzdCBleHRlbmRzIFRlc3RDYXNlDQotew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENLID0gIm9yZy5lY2xpcHNlLnRlc3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDID0gDQotCQkJImltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOyIgKyAiXG4iICsNCi0JCQkicHVibGljIGNsYXNzIFRlc3QgeyIgKyAiXG4iICsNCi0JCQkiCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBuYW1lID0gXCJhcmVcIjsiICsgIlxuIiArDQotCQkJIiAgIHB1YmxpYyBUZXN0KCkge30iICsgIlxuIiArDQotCQkJIglwdWJsaWMgaW50IGNyZWF0ZUludCgpIHtyZXR1cm4gMDt9IiArICJcbiIgKw0KLQkJCSJ9IjsJDQotDQotCXByaXZhdGUgVGVzdFByb2plY3QgcHJvamVjdDsNCi0JDQotCXB1YmxpYyB2b2lkIG1hbnVhbFNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlwcm9qZWN0ID0gbmV3IFRlc3RQcm9qZWN0KCJKYXZhUHJval8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOw0KLQkJcHJvamVjdC5jcmVhdGVTb3VyY2VGb2xkZXIoInNyYyIpOw0KLQl9DQotCQ0KLQlAT3ZlcnJpZGUNCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsNCi0JCQlwcm9qZWN0LmRpc3Bvc2UoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGVOcGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCXRyeSB7DQotCQkJQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVBU1QoKEZpbGUpbnVsbCwgbnVsbCk7DQotCQl9IGNhdGNoKE51bGxQb2ludGVyRXhjZXB0aW9uIF8pIHt9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEZpbGUgdGVtcEphdmFGaWxlID0gY3JlYXRlVGVtcEphdmFGaWxlKCk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUFTVCh0ZW1wSmF2YUZpbGUsIG51bGwpOw0KLQkJYXNzZXJ0Tm90TnVsbChub2RlKTsNCi0JCWFzc2VydFRydWUobm9kZSBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCk7CQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBU1RJVHlwZU5wZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJdHJ5IHsNCi0JCQlBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgoSUNvbXBpbGF0aW9uVW5pdCludWxsLCBudWxsKTsNCi0JCX0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gXykge30NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFTVElUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQltYW51YWxTZXRVcCgpOw0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIFNSQyk7DQotCQlBU1ROb2RlIG5vZGUgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCWFzc2VydE5vdE51bGwobm9kZSk7DQotCQlhc3NlcnRUcnVlKG5vZGUgaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpOw0KLQl9CQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCWZpbmFsIElUeXBlIHNvdXJjZVR5cGUgPSBwcm9qZWN0LmNyZWF0ZVR5cGUocHJvamVjdC5jcmVhdGVQYWNrYWdlKFBDSyksICJUZXN0LmphdmEiLCBTUkMpOw0KLQkJQ29tcGlsYXRpb25Vbml0IHVuaXQgPSBBU1RVdGlscy5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChzb3VyY2VUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpLCBudWxsKTsNCi0JCQ0KLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYWJzdHJhY3RUeXBlID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlRGVjbGFyYXRpb24oIlRlc3QiLCB1bml0KTsNCi0JCWFzc2VydE5vdE51bGwoYWJzdHJhY3RUeXBlKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEZWNsYXJhdGlvbkZvcklubmVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24NCi0Jew0KLQkJbWFudWFsU2V0VXAoKTsNCi0JCVN0cmluZyBzb3VyY2UgPSAicHVibGljIGNsYXNzIFRlc3QgeyIgKw0KLQkJCSJwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcnMge30iICsNCi0JCSJ9IjsJCQ0KLQkJDQotCQlmaW5hbCBJVHlwZSBzb3VyY2VUeXBlID0gcHJvamVjdC5jcmVhdGVUeXBlKHByb2plY3QuY3JlYXRlUGFja2FnZShQQ0spLCAiVGVzdC5qYXZhIiwgc291cmNlKTsNCi0JCUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb21waWxhdGlvblVuaXQoc291cmNlVHlwZS5nZXRDb21waWxhdGlvblVuaXQoKSwgbnVsbCk7DQotCQkNCi0JCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGFic3RyYWN0VHlwZSA9IEFTVFV0aWxzLmdldEluc3RhbmNlKCkuZ2V0VHlwZURlY2xhcmF0aW9uKCJQYXJhbWV0ZXJzIiwgdW5pdCk7DQotCQlhc3NlcnROb3ROdWxsKGFic3RyYWN0VHlwZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVTaWduYXR1cmVGb3JTaW1wbGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFyQXJnU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcigiU3RyaW5nIHAiKTsNCi0JCWFzc2VydEZhbHNlKCJTaWduYXR1cmUgc2hvdWxkIG5vdCBzdGFydCB3aXRoICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzBdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVNpZ25hdHVyZUZvckFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFyQXJnU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcigiU3RyaW5nW10gcCIpOw0KLQkJYXNzZXJ0VHJ1ZSgiU2lnbmF0dXJlIHNob3VsZCBzdGFydCB3aXRoICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzBdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JCWFzc2VydEZhbHNlKCJTaWduYXR1cmUgc2Vjb25kIGNhaGFyYWN0ZXIgbXVzdCBub3QgYmUgJ1snIiwgdmFyQXJnU2lnbmF0dXJlLnRvQ2hhckFycmF5KClbMV0gPT0gU2lnbmF0dXJlLkNfQVJSQVkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlU2lnbmF0dXJlRm9yVmFyQXJnKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlmaW5hbCBTdHJpbmcgdmFyQXJnU2lnbmF0dXJlID0gZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcigiU3RyaW5nLi4uIHAiKTsNCi0JCWFzc2VydFRydWUoIlNpZ25hdHVyZSBzaG91bGQgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRGYWxzZSgiU2lnbmF0dXJlIHNlY29uZCBjYWhhcmFjdGVyIG11c3Qgbm90IGJlICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzFdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZVNpZ25hdHVyZUZvck11bHRpRGltZW5zaW9uYWxWYXJBcmcoKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIFN0cmluZyB2YXJBcmdTaWduYXR1cmUgPSBnZXRUeXBlU2lnbmF0dXJlRm9yUGFyYW1ldGVyKCJTdHJpbmdbXVtdLi4uIHAiKTsNCi0JCWFzc2VydFRydWUoIlNpZ25hdHVyZSBzaG91bGQgc3RhcnQgd2l0aCAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVswXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgc2Vjb25kIGNhaGFyYWN0ZXIgbXVzdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVsxXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCQlhc3NlcnRUcnVlKCJTaWduYXR1cmUgdGhpcmQgY2FoYXJhY3RlciBtdXN0IGJlICdbJyIsIHZhckFyZ1NpZ25hdHVyZS50b0NoYXJBcnJheSgpWzJdID09IFNpZ25hdHVyZS5DX0FSUkFZKTsNCi0JCWFzc2VydEZhbHNlKCJTaWduYXR1cmUgZm91cnRoIGNoYXJhY3RlZCBtdXN0IG5vdCBiZSAnWyciLCB2YXJBcmdTaWduYXR1cmUudG9DaGFyQXJyYXkoKVszXSA9PSBTaWduYXR1cmUuQ19BUlJBWSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZVNpZ25hdHVyZUZvclBhcmFtZXRlcihmaW5hbCBTdHJpbmcgcGFyYW1EZWZpbml0aW9uKSB0aHJvd3MgRXhjZXB0aW9uDQotCXsNCi0JCWZpbmFsIEFTVFV0aWxzIGFzdFV0aWxzID0gQVNUVXRpbHMuZ2V0SW5zdGFuY2UoKTsNCi0NCi0JCW1hbnVhbFNldFVwKCk7DQotCQlTdHJpbmcgc291cmNlID0gInB1YmxpYyBjbGFzcyBUZXN0IHsgcHVibGljIHZvaWQgdmFyQXJnTWV0aG9kKCIgKyBwYXJhbURlZmluaXRpb24gKyAiKXt9IH0iOw0KLQ0KLQkJZmluYWwgSVR5cGUgc291cmNlVHlwZSA9IHByb2plY3QuY3JlYXRlVHlwZShwcm9qZWN0LmNyZWF0ZVBhY2thZ2UoUENLKSwgIlRlc3QuamF2YSIsIHNvdXJjZSk7DQotCQlmaW5hbCBJTWV0aG9kIHZhcmFyZ01ldGhvZCA9IHNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpWzBdOw0KLQkJYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG1ldGhvZCBuYW1lIiwgInZhckFyZ01ldGhvZCIsIHZhcmFyZ01ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsNCi0JCWZpbmFsIENvbXBpbGF0aW9uVW5pdCB1bml0ID0gYXN0VXRpbHMuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHNvdXJjZVR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCksIG51bGwpOw0KLQkJZmluYWwgTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbCA9IGFzdFV0aWxzLmdldE1ldGhvZERlY2xhcmF0aW9uKHZhcmFyZ01ldGhvZCwgKFR5cGVEZWNsYXJhdGlvbikgYXN0VXRpbHMuZ2V0VHlwZURlY2xhcmF0aW9uKCJUZXN0IiwgdW5pdCkpOw0KLQkJYXNzZXJ0RXF1YWxzKCJPbmUgcGFyYW1ldGVyIGV4cGVjdGVkIiwgMSwgbWV0aG9kRGVjbC5wYXJhbWV0ZXJzKCkuc2l6ZSgpKTsNCi0NCi0JCXJldHVybiBhc3RVdGlscy5nZXRUeXBlU2lnbmF0dXJlKChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKSBtZXRob2REZWNsLnBhcmFtZXRlcnMoKS5pdGVyYXRvcigpLm5leHQoKSk7DQotCX0JDQotCQ0KLQlwcml2YXRlIEZpbGUgY3JlYXRlVGVtcEphdmFGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbg0KLQl7DQotCQlGaWxlIGRpciA9IFRlc3RGaWxlVXRpbHMuY3JlYXRlVGVtcERpcmVjdG9yeSgiIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsNCi0JCUZpbGUgdGVtcENsYXNzRmlsZSA9IG5ldyBGaWxlKGRpciwgIlRlc3QuamF2YSIpOw0KLQkJRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHRlbXBDbGFzc0ZpbGUpOw0KLQkJZncud3JpdGUoInBhY2thZ2UgIiArIFBDSyArICI7XG4iICsgU1JDKTsNCi0JCWZ3LmNsb3NlKCk7DQotCQkNCi0JCXJldHVybiB0ZW1wQ2xhc3NGaWxlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC53cy5qYXh3cy51dGlscy50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2pheHdzL3V0aWxzL3Rlc3RzL2ludGVybmFsL21vY2svRW5kcG9pbnRGb3JtYXQuc3JjIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvbW9jay9FbmRwb2ludEZvcm1hdC5zcmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiZjZmYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LndzLmpheHdzLnV0aWxzLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvamF4d3MvdXRpbHMvdGVzdHMvaW50ZXJuYWwvbW9jay9FbmRwb2ludEZvcm1hdC5zcmMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1wdWJsaWMgY2xhc3MgRW5kcG9pbnR7cHVibGljIEVuZHBvaW50KCl7fXB1YmxpYyB2b2lkIHVzZVZvaWQoKXt9cHVibGljIFN0cmluZyBlY2hvU3RyaW5nKFN0cmluZyBzKXtyZXR1cm4gc319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmptb2NrLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuam1vY2svLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWVlMDUwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2ptb2NrLWNvcmUtMS4yLjAuamFyIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8ucHJvamVjdCBiL3Rlc3RzL29yZy5qbW9jay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjNmNmI0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5qbW9jazwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuam1vY2svLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNjExMDc4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgSnVuIDIzIDE4OjQxOjU1IEVFU1QgMjAwOQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmptb2NrL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmptb2NrL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMWUzNDc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5qbW9jay9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMA0KLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQNCi1FeHBvcnQtUGFja2FnZTogb3JnLmptb2NrLA0KLSBvcmcuam1vY2suYnVpbGRlciwNCi0gb3JnLmptb2NrLmNvcmUsDQotIG9yZy5qbW9jay5jb3JlLmNvbnN0cmFpbnQsDQotIG9yZy5qbW9jay5jb3JlLm1hdGNoZXIsDQotIG9yZy5qbW9jay5jb3JlLnN0dWIsDQotIG9yZy5qbW9jay5leHBlY3RhdGlvbiwNCi0gb3JnLmptb2NrLnV0aWwNCi1CdW5kbGUtVmVuZG9yOiBvcmcuam1vY2sNCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvam1vY2stY29yZS0xLjIuMC5qYXINCi1CdW5kbGUtVmVyc2lvbjogMS4yLjANCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiBnbG9iYWwNCi1CdW5kbGUtTmFtZTogSk1vY2sNCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyDQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmptb2NrO3NpbmdsZXRvbjo9dHJ1ZQ0KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQ0KLQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5qbW9jay9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmptb2NrL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjdhY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+QXVndXN0IDIwLCAyMDA5PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmptb2NrL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuam1vY2svYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTNhOGZjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuam1vY2svYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gbGliLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmptb2NrL2xpYi9qbW9jay1jb3JlLTEuMi4wLmphciBiL3Rlc3RzL29yZy5qbW9jay9saWIvam1vY2stY29yZS0xLjIuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI5ZDMxN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmptb2NrL2xpYi9qbW9jay1jb3JlLTEuMi4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIK